【问题标题】:Nodejs Promise "res.end is not a function" errorNodejs Promise“res.end 不是函数”错误
【发布时间】:2020-02-26 05:53:40
【问题描述】:

我正在重构我的代码以使用 Promises 删除“回调地狱”,但遇到了一个我无法通过的错误。我的代码接收 ID 列表并处理它们进行很少的数据库调用,这就是我有这个“回调地狱”的原因。 在 Promise 之前一切正常。当我必须回复客户端时,res 等于 0。

  function processVMDelete(returnedVMIDs){
    return new Promise((resolve, reject) => {

        var mariasqlClient = dbConnection();
        mariasqlClient.query( sqlUpdateDELETE_STATE_ByVMID, [ 
          'DELETE', 
          returnedVMIDs
        ], function(err, rows) {
          if (err){
            reject(err);
          }
          console.log('finish update');
// dont' need to return anything here
          resolve(0);
        });
        mariasqlClient.end();
    });
  }

  function getListExpVM(){
    return new Promise((resolve, reject) => {

      var vmList = [];
      var mariasqlClient = dbConnection();
      mariasqlClient.query( sqlSearch_ByUSERNAMEAndSTATE, [ 
        requesterUsername, 
        'ACTIVE'
      ], function(err, rows) {
        if (err){
          reject(err);
        }
          vmList = filterExpiredVMs(rows);

          var response = {
            status : 200,
            success : 'Successfull',
            data : vmList,
            requester: requesterUsername
          };
          resolve(response);
      }); 
      mariasqlClient.end();
    });
  }



router.post('/processVMs', function(req, res) {
    var returnedVMIDs = JSON.parse(req.body.data);

    processVMDelete(returnedVMIDs)
      .then(res => {
        console.log('done');

        // check if there is more available for the user:
        getListExpVM()
          .then(response => {
            console.log('sending back list of VMs');

//===>>> ERROR HERE: res.end is not a function
            res.end(JSON.stringify(response));

          })
          .catch(err => {
            console.log('error', err.message);
            logger.error("Error getting expired VMs: " + err.message);

//===>>> ERROR HERE: res.send is not a function
            res.status(500).send({error: err.message})
          });
      })
      .catch(err => {
        console.log('error', err.message);
        logger.error("Error processing VMs: " + err.message);
//===>>> ERROR HERE: res.send is not a function
        res.status(500).send({error: err.message})
      });
});

【问题讨论】:

  • 这是因为processVMDelete(returnedVMIDs).then(res => {...}) - 无论processVMDelete 返回什么,您都在尝试调用.end 和.status 方法。将其重命名为其他名称,以便它使用来自 router.post("/processVMs", function(req, res) {..}) 的原始 res
  • 另外,你在Promises 的情况下仍然遇到类似回调地狱的情况,你有什么版本的Node.js 可用?也许你可以在这里使用async/await 让它变得更简单。

标签: node.js express promise


【解决方案1】:

你已经用这个重新定义了res:

processVMDelete(returnedVMIDs)
  .then(res => {...})

这将隐藏与整个请求关联的更高范围的res(您需要用于res.end())。将此名称更改为 result 之类的其他名称,然后更改使用此 result 的相应引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2016-12-06
    相关资源
    最近更新 更多