我正在使用Node.js / Express.js将数据安装到我的MySQL数据库。 插入数据工作正常,但返回成功/失败会给我一个错误。
TypeError: Cannot read property 'status' of undefined
这是我的代码:
var crud = {
newProject: function (req, res, callback) {
db.query('INSERT INTO projects SET ?', req.body, function(err, res) {
// This is where it fails
if(err){
return res.status(500).json({error: err});
} else {
return res.status(200).json({success: 'Insert row success'});
}
});
},
}
// Express routing
app.post('/project/*', crud.newProject);
我不能在这里找到什么?
解决方案
所以这就是我以前的工作原理(按照建议将'res'改为'resp'):
if (err) throw err;
res.end(JSON.stringify({response: 'Success'}));
答案 0 :(得分:3)
您定义res
两次。快速响应对象将被节点回调中的数据参数覆盖。
尝试以下方法(见评论)
var crud = {
newProject: function (req, res, callback) {
// changed 'res' to 'resp' to avoid collision with Express' 'res' object
db.query('INSERT INTO projects SET ?', req.body, function(err, resp) { // here's your error
// This is where it fails
if(err){
return res.status(500).json({error: err});
} else {
return res.status(200).json({success: 'Insert row success'});
}
});
},
}
// Express routing
app.post('/project/*', crud.newProject);
如果您在主配置中的最后一个app.use()
之后定义错误处理中间件功能
app.use(function (err, req, res, next) {
res.status(500).send(err.message || 'Internal server error.')
})
您可以将next
回调用作catchall错误处理程序,因此上面的内容将成为
var crud = {
newProject: function (req, res, callback) {
db.query('INSERT INTO projects SET ?', req.body, function(err, resp) {
if (err) return callback(err);
return res.json({success: 'Insert row success'});
});
},
}
// Express routing
app.post('/project/*', crud.newProject);
默认情况下, res.json()
应在响应标头中添加200 Success
代码。理想情况下,您需要在检查resp
的状态后检查节点回调中的err
数据参数,以正确处理响应并相应地继续,特别是如果您正在处理与延续相关的最后评估记录令牌通常在一些DBAL和API为您做的响应中提供,而有些则不做。无论哪种方式,您都希望确保在成功响应之前获取剩余记录不需要额外的递归。
答案 1 :(得分:0)
看起来res
对象未定义,因为它在插入后没有返回任何响应。您可以返回一个新对象,如:
return {
status: 200,
json: {success: 'Insert row success'}
}