node.js, express. js и mysql - Невозможно прочитать свойство 'status' из неопределенного - PullRequest
0 голосов
/ 10 января 2020

Я новичок в node.js и у меня проблема с получением данных из mysql и отправкой в ​​api ответ. Вот мои настройки:

дБ. js:

var mysql = require('mysql2');
var util = require('util')

const pool = mysql.createPool({
  connectionLimit : 100, //important
  host: 'AWSHost',
  user: 'devadmin',
  password: 'my password',
  database: 'DB',
  waitForConnections: true,
  queueLimit: 0
})

pool.getConnection((err, connection) => {
  if (err) {
      if (err.code === 'PROTOCOL_CONNECTION_LOST') {
          console.error('Database connection was closed.')
      }
      if (err.code === 'ER_CON_COUNT_ERROR') {
          console.error('Database has too many connections.')
      }
      if (err.code === 'ECONNREFUSED') {
          console.error('Database connection was refused.')
      }
  }
  if (connection) {
  console.log('DB connected, all good'),
   connection.release()
  return
}
})
pool.query = util.promisify(pool.query) // Magic happens here.

module.exports = pool

приложение. js модуль:

const express = require('express');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const config = require('./src/lib/config');
const logger = require('./src/lib/logger');
const pool = require('./src/api/db/db')
const log = logger(config.logger);
const app = express();
const port = process.env.PORT || 8081;

const swaggerUi = require('swagger-ui-express');
const YAML = require('yamljs');
const swaggerDocument = YAML.load('./swagger.yaml');
var options = {
  customCss: '.swagger-ui .topbar { display: none }'
};

app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());

/*
 * Routes
 */
app.use('/1/user', require('./src/api/routes/user'));

// catch 404
app.use((req, res, next) => {
  log.error(`Error 404 on ${req.url}.`);
  res.status(404).send({ status: 404, error: 'Not found' });
});

// catch errors
app.use((err, req, res, next) => {
  const status = err.status || 500;
  const msg = err.error || err.message;
  log.error(`Error ${status} (${msg}) on ${req.method} ${req.url} with payload ${req.body}.`);
  res.status(status).send({ status, error: msg });
});


module.exports = app;

app.listen(port, () => console.log(`App listening on port ${port}!`))

Тогда у меня есть маршрутизатор: пользователь. js

/**
 * Get user by usersID
 */
router.get('/:usersID', async (req, res, next) => {
  debugger;
  const options = {
    usersID: req.params['usersID']
  };

  try {
    const result = await user.getUserByUsersId(options);
    res.status(result.status || 200).send(result.data);
  } catch (err) {
    next(err);
  }
 });

Затем служба:

/**
 * @param {Object} options
 * @param {Integer} options.usersID The usersID that needs to be fetched. Use usersID 1 for testing.
 * @throws {Error}
 * @return {Promise}
 */
module.exports.getUserByUsersId = async (options) => {
 let sql = 'SELECT * FROM users';
  pool.query(sql, (err, result,) => {
    if (err)  //throw err;
      throw new ServerError({
        status: 500, // Or another error code.
        error: 'Server Error' // Or another error message.
      });

    return {
      status: 200,
      data: result,
    }

  }
  )
 }

Проблема, с которой я столкнулся является то, что я могу использовать console.log (результат) и получить результаты из БД для вывода на консоль, но при использовании почтальона я получаю сообщение об ошибке «Не удается прочитать свойство« status »из неопределенного».

,"msg":"Error 500 (Cannot read property 'status' of undefined) on GET /1/user/1 with payload [object Object]."

Может кто-нибудь помочь с тем, что я делаю неправильно, или мне нужен дополнительный шаг для форматирования результатов перед отправкой? Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Ваш getUserByUsersId не возвращает вывод вашего запроса. Попробуйте это:

module.exports.getUserByUsersId = async (options) => {
    let sql = 'SELECT * FROM users';
    return new Promise((resolve, reject) => {
        pool.query(sql, (err, result,) => {
            if (err) {
                //throw err;
                reject(new ServerError({
                    status: 500, // Or another error code.
                    error: 'Server Error' // Or another error message.
                }));
                return
            }

            resolve({
                status: 200,
                data: result,
            })
        })
    })
}

Технически вам больше не нужна декларация async, но мне нравится ее сохранять, потому что она лучше подходит для моей IDE, чем просто возвращение обещания (если только я не добавлю аннотацию, но я отвлекся).

0 голосов
/ 10 января 2020

Вы можете попытаться выполнить запрос в вашем маршрутизаторе get без вызова службы с функцией await.

//dont forget to initialize your pool var
router.get('/:usersID', function(req, res, next){
    debugger;
    const options = {
        usersID: req.params['usersID']
    };

    let sql = 'SELECT * FROM users';
    pool.query(sql, (err, result) => {
        if (err) {
            console.log(err.message)
            res.send(err.message)
            return
        }
        res.send(result)
        return
    });

})

Ваша служба

module.exports.getUserByUsersId = function (options)  {
    return new Promise(resolve => {
            let sql = 'SELECT * FROM users';
            pool.query(sql, (err, result) => {
                    if (err) {
                        console.log(err.message)
                        resolve(err.message)
                    }
                    console.log(result)
                     resolve(result)
            })
    });

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...