插入后无法返回正确的响应
我使用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'}));
你的定义res
两次。 快速响应对象正在被您的节点callback中的数据参数覆盖。
尝试以下(见评论)
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);
如果您在主configuration中的最后一个app.use()
之后定义了error handling中间件函数
app.use(function (err, req, res, next) { res.status(500).send(err.message || 'Internal server error.') })
你可以使用next
callback作为一个catchallerror handling程序,所以上面会变成
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
代码到响应头。 理想情况下,在检查err
的状态以正确处理响应并相应地进行操作之后,尤其是在处理与通常在响应中提供的连续令牌相关的最后一个评估logging时,您会想要从节点callback中检查resp
数据参数DBAL和API为你做,有些则不。 无论哪种方式,您都需要确保在成功响应之前,不需要额外的recursion来获取剩余的logging。
看起来像res
对象是未定义的,因为插入后没有返回任何响应。 您可能会返回一个新的对象,如:
return { status: 200, json: {success: 'Insert row success'} }