【问题标题】:Not able to return proper response after insert插入后无法返回正确的响应
【发布时间】:2017-08-29 18:59:18
【问题描述】:

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

【问题讨论】:

    标签: javascript mysql node.js express


    【解决方案1】:

    您定义了两次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 回调作为一个包罗万象的错误处理程序,因此上述内容将变为

    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 的状态后检查节点回调中的resp 数据参数,以正确处理响应并进行相应处理,尤其是在处理与通常提供的延续令牌相关联的最后评估记录时一些 DBAL 和 API 为您做出的响应,而另一些则没有。无论哪种方式,您都希望确保在成功响应之前不需要额外的递归来获取剩余的记录。

    【讨论】:

    • 我的问题是res.whatever 返回未定义的错误消息:/
    • 看到上面的编辑,注意到我添加的 cmets 了吗?您定义res 两次。您只需要更改回调参数使用的命名约定。
    • 是的,我按照您的建议将res 更改为resp。仍然得到错误。但是改变我返回结果的方式使它起作用。所以谢谢:)
    • 仅供参考,如果我没记错的话,只需调用res.json({success: 'Insert row success'}) 就会得到相同的结果。如果在定义路由后注入了适当的中间件,则可以返回调用回调的结果而不是抛出错误。查看编辑,我认为这将是一个更好的解决方案,自从我使用 Express 已经有一段时间了;)
    【解决方案2】:

    看起来res 对象未定义,因为它在插入后没有返回任何响应。您可以返回一个新对象,例如:

    return { status: 200, json: {success: 'Insert row success'} }

    【讨论】:

    • 你怎么知道它是否成功? ;-)
    • 因为err对象未定义。
    • 是的,dcd018 的响应看起来更准确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2016-09-13
    • 2020-10-21
    • 2011-06-14
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多