插入后无法返回正确的响应

时间:2017-08-29 18:59:18

标签: javascript mysql node.js express

我正在使用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'}));

2 个答案:

答案 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'} }