如何从 express-openapi mysql.query() 调用中获取 JSON 输出?
How do I get JSON output from an express-openapi mysql.query() call?
我在通过 REST API.
将 MySQL 查询的结果输出为 JSON 时遇到问题
在下面,您可以看到我已尝试 return
users
变量并强制执行 JSON.parse(JSON.stringify(users));
函数。
console.log(users)
记录一个正确的 JSON 对象:
{ user1:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user1',
userEmail: 'user@email.com' },
user2:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user2',
userEmail: 'user@email.com' },
user3:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user3',
userEmail: 'user@email.com' },
user4:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user4',
userEmail: 'user@email.com' },
user5:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user5',
userEmail: 'user@email.com' } }
但是我在 Postman 中什么也得不到,并且在浏览器中出现语法错误 return users ? [users] : []
和 return JSON.parse(JSON.stringify(users)) ? [JSON.parse(JSON.stringify(users)) ] : [];
:
SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data
import { mysqlConn } from '../../../index';
let users = {};
const usersService = {
getUser(userName) {
if (userName === 'all') {
mysqlConn.query('SELECT first_name,last_name,username,email FROM users LIMIT 5;', [], function (error, results, fields){
if (error) return error;
for (const row in results) {
users[results[row].username] = {
firstName: results[row].first_name,
lastName: results[row].last_name,
userName: results[row].username,
userEmail: results[row].email,
}
}
console.log(JSON.parse(JSON.stringify(users)) );
return JSON.parse(JSON.stringify(users)) ? [JSON.parse(JSON.stringify(users)) ] : [];
// This was the original attempt to get the data to load to Postman
// return users ? [users] : [];
mysqlConn.end();
});
} else {
// This functionality not built out yet. This will be a query similar to the above, only with a 'WHERE' clause in the mysql statement.
// return users[userName] ? [users[userName]] : [];
}
}
};
export default usersService;
所以解决方案存在于两个不同的地方:
./api/v1/services/usersService.js
和 ./api/v1/paths/usersPaths.js
在 usersPaths.js
文件中,我必须将 GET
函数转换为 async
函数,然后 await
来自 userPaths.js
文件的响应.
// ./api/v1/paths/usersPaths.js
export default function (usersService) {
let operations = {
GET
};
async function GET(req, res, next) {
res.status(200).json(await usersService.getUser(req.query.userName));
}
GET.apiDoc = {
summary: 'Returns information about the selected user',
operationId: 'getUser',
parameters: [
{
in: 'query',
name: 'userName',
required: true,
type: 'string',
}
],
responses: {
200: {
description: 'Information about the selected user',
schema: {
type: 'array',
items: {
$ref: '#/definitions/User'
}
}
},
default: {
description: 'An error has occured',
schema: {
additionalProperties: true
}
}
}
};
return operations;
}
第二部分是将 usersService.js
文件中的功能转换为 Promise
:
// ./api/v1/services/usersService.js
import { mysqlConn } from '../../../index';
let users = {};
const usersService = {
getUser(userName) {
return new Promise(function(resolve, reject) {
if (userName === 'all') {
mysqlConn.query('SELECT first_name,last_name,username,email FROM users LIMIT 5;', [], function (error, results, fields){
if (error) {
resolve(error);
} else {
for (const row in results) {
users[`${results[row].username}`] = {
firstName: results[row].first_name,
lastName: results[row].last_name,
userName: results[row].username,
userEmail: results[row].email,
};
}
resolve(users);
}
});
} else {
// functionality not built out yet
// return users[userName] ? [users[userName]] : [];
}
}
)}
};
export default usersService;
我在通过 REST API.
将 MySQL 查询的结果输出为 JSON 时遇到问题在下面,您可以看到我已尝试 return
users
变量并强制执行 JSON.parse(JSON.stringify(users));
函数。
console.log(users)
记录一个正确的 JSON 对象:
{ user1:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user1',
userEmail: 'user@email.com' },
user2:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user2',
userEmail: 'user@email.com' },
user3:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user3',
userEmail: 'user@email.com' },
user4:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user4',
userEmail: 'user@email.com' },
user5:
{ firstName: 'First Name',
lastName: 'Last Name',
userName: 'user5',
userEmail: 'user@email.com' } }
但是我在 Postman 中什么也得不到,并且在浏览器中出现语法错误 return users ? [users] : []
和 return JSON.parse(JSON.stringify(users)) ? [JSON.parse(JSON.stringify(users)) ] : [];
:
SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data
import { mysqlConn } from '../../../index';
let users = {};
const usersService = {
getUser(userName) {
if (userName === 'all') {
mysqlConn.query('SELECT first_name,last_name,username,email FROM users LIMIT 5;', [], function (error, results, fields){
if (error) return error;
for (const row in results) {
users[results[row].username] = {
firstName: results[row].first_name,
lastName: results[row].last_name,
userName: results[row].username,
userEmail: results[row].email,
}
}
console.log(JSON.parse(JSON.stringify(users)) );
return JSON.parse(JSON.stringify(users)) ? [JSON.parse(JSON.stringify(users)) ] : [];
// This was the original attempt to get the data to load to Postman
// return users ? [users] : [];
mysqlConn.end();
});
} else {
// This functionality not built out yet. This will be a query similar to the above, only with a 'WHERE' clause in the mysql statement.
// return users[userName] ? [users[userName]] : [];
}
}
};
export default usersService;
所以解决方案存在于两个不同的地方:
./api/v1/services/usersService.js
和 ./api/v1/paths/usersPaths.js
在 usersPaths.js
文件中,我必须将 GET
函数转换为 async
函数,然后 await
来自 userPaths.js
文件的响应.
// ./api/v1/paths/usersPaths.js
export default function (usersService) {
let operations = {
GET
};
async function GET(req, res, next) {
res.status(200).json(await usersService.getUser(req.query.userName));
}
GET.apiDoc = {
summary: 'Returns information about the selected user',
operationId: 'getUser',
parameters: [
{
in: 'query',
name: 'userName',
required: true,
type: 'string',
}
],
responses: {
200: {
description: 'Information about the selected user',
schema: {
type: 'array',
items: {
$ref: '#/definitions/User'
}
}
},
default: {
description: 'An error has occured',
schema: {
additionalProperties: true
}
}
}
};
return operations;
}
第二部分是将 usersService.js
文件中的功能转换为 Promise
:
// ./api/v1/services/usersService.js
import { mysqlConn } from '../../../index';
let users = {};
const usersService = {
getUser(userName) {
return new Promise(function(resolve, reject) {
if (userName === 'all') {
mysqlConn.query('SELECT first_name,last_name,username,email FROM users LIMIT 5;', [], function (error, results, fields){
if (error) {
resolve(error);
} else {
for (const row in results) {
users[`${results[row].username}`] = {
firstName: results[row].first_name,
lastName: results[row].last_name,
userName: results[row].username,
userEmail: results[row].email,
};
}
resolve(users);
}
});
} else {
// functionality not built out yet
// return users[userName] ? [users[userName]] : [];
}
}
)}
};
export default usersService;