Как получить выходные данные JSON из вызова express-openapi mysql.query ()? - PullRequest
0 голосов
/ 23 октября 2018

У меня проблема с получением результатов MySQL Query для вывода в виде JSON через REST API.

Ниже вы можете видеть, что я также пытался 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;

1 Ответ

0 голосов
/ 25 октября 2018

Таким образом, решение находилось в двух разных местах:

./api/v1/services/usersService.js и ./api/v1/paths/usersPaths.js

В файле usersPaths.js мне пришлось превратить функцию GET в *Функция 1009 *, а затем 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;
...