繁体   English   中英

node.js、express.js 和 mysql - 无法读取未定义的属性“状态”

[英]node.js, express.js, and mysql - Cannot read property 'status' of undefined

我是 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

app.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}!`))

然后我有一个路由器:user.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(result) 并从数据库中获取结果以输出到控制台,但是在使用邮递员时出现错误“无法读取未定义的属性‘状态’” .

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

任何人都可以帮助我了解我做错了什么,或者在发送之前我是否需要额外的步骤来格式化结果? 任何帮助表示赞赏,谢谢!!

您可以尝试在 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)
            })
    });

}

您的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 一起玩得更好,而不仅仅是返回承诺(除非我包含注释,但我离题了)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM