我在获取MySQL查询结果以通过REST API输出为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;
答案 0 :(得分:0)
因此,解决方案位于两个不同的地方:
./api/v1/services/usersService.js
和./api/v1/paths/usersPaths.js
在usersPaths.js
文件中,我不得不将GET
函数转换为async
函数,然后await
从userPaths.js
文件得到响应。 / p>
// ./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;