mysql - 如何从 express-openapi mysql.query() 调用获取 JSON 输出?

标签 mysql node.js json express openapi

我在通过 REST API 将 MySQL 查询结果输出为 JSON 时遇到问题。

在下面,您可以看到我尝试返回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 中什么也没得到,而且我在浏览器中遇到语法错误,并且两个 返回用户? [用户]:[] 返回 JSON.parse(JSON.stringify(users)) ? [JSON.parse(JSON.stringify(users))]:[];:

语法错误:JSON.parse:JSON 数据第 1 行第 1 列出现意外数据结束

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;

关于mysql - 如何从 express-openapi mysql.query() 调用获取 JSON 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52938676/

相关文章:

mysql - 确定 mysql 中索引的状态

mysql - 在 MySQL 中使用触发器保存删除记录的用户的 USER_ID

javascript - 语法错误: "JSON.parse: unexpected non-whitespace ..." when returning JSON from PHP

java - 如何使用 Java 通过 Web 服务以 JSON 格式公开数据?

php - php函数的逻辑

php - PHP 中的 MySQL 数据按日期时间对 JSON 数据进行排序

mysql - 在 Express.js 应用程序中处理 Mysql 数据库的最佳方法是什么?

javascript - express-subdomain 处理任何子域

node.js - 尝试以多对多关系创建一个实例和多个相关实例

javascript - 方法在ajax调用中返回null