![](/img/trans.png)
[英]Sequelize.js/Node.js/Express.js: Tasks.findAll()returns a TypeError:Cannot read property 'findAll' of undefined
[英]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.