【问题标题】:Cannot set headers after they are sent to the client when not fond the record i nodejs当在节点js中找不到记录时,无法在将标头发送到客户端后设置标头
【发布时间】:2020-10-24 13:21:20
【问题描述】:

我想查找记录并更新 mongoose 和 nodejs 中的记录。

  async DeleteRole(req, res, next) {
    let validationData = await this.ValidationAction(req, res);
    if (validationData[0]) {
      Role.findByIdAndUpdate(
        req.params.id,
        { $set: { isDelete: true } },
        { useFindAndModify: false },
        (error, role)=> {
          console.log(role)
          if (error) next(error);
          if (!role) return res.status(200).send({
            message: "NotFoundRecord",
            statusCode: 200,
            success: false,
          });
        }
      );
       return res.status(200).send({
        message: "Success",
        statusCode: 200,
        success: true,
      });
    }
     return res.status(200).send({
      message: "BadREquest",
      statusCode: 400,
      success: false,
    });
  }

我想在找不到记录时向我显示未找到记录的错误并解决其他问题。

但是当我发送请求时,它会显示这个错误:

F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\helpers\promiseOrCallback.js:19 抛出错误; ^

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头 在 ServerResponse.setHeader (_http_outgoing.js:533:11) 在 ServerResponse.header (F:\Projects\Nodejs\SalesSignal\node_modules\express\lib\response.js:771:10) 在 ServerResponse.send (F:\Projects\Nodejs\SalesSignal\node_modules\express\lib\response.js:170:12) 在 ServerResponse.json (F:\Projects\Nodejs\SalesSignal\node_modules\express\lib\response.js:267:15) 在 ServerResponse.send (F:\Projects\Nodejs\SalesSignal\node_modules\express\lib\response.js:158:21) 在 RoleController.Notfound (F:\Projects\Nodejs\SalesSignal\src\http\controller\BaseController.js:26:28) 在 F:\Projects\Nodejs\SalesSignal\src\http\controller\RoleController.js:25:34 在 F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\model.js:4882:16 在 F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\model.js:4882:16 在 F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\model.js:4882:16 在 F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\helpers\promiseOrCallback.js:16:11 在 F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\model.js:4905:21 在 F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\query.js:4382:18 在 model.Query.Query._findAndModify (F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\query.js:3462:12) 在模型.查询。 (F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\query.js:3037:8) 在 model.Query._wrappedThunk [as _findOneAndUpdate] (F:\Projects\Nodejs\SalesSignal\node_modules\mongoose\lib\helpers\query\wrapThunk.js:16:8)
在函数实例上发出“错误”事件:

**现在我要拖东西:A => 找到查找和更新记录并解决此问题的最佳方法?我怎么解决这个问题 ??? **

【问题讨论】:

  • Role.findByIdAndUpdate 不返回一个承诺,以便您也可以在那里使用await 吗?

标签: javascript node.js


【解决方案1】:

您在next(error) 调用中缺少else 语句或return,并且发送Success 消息的代码不会等待findByIdAndUpdate 完成 - 它总是发送响应优先。

async DeleteRole(req, res, next) {
  let validationData = await this.ValidationAction(req, res);
  if (validationData[0]) {
    Role.findByIdAndUpdate(req.params.id, {
      $set: { isDelete: true }
    }, { useFindAndModify: false }, (error, role)=> {
      if (error) {
        next(error);
      } else if (!role) {
        res.status(200).send({
          message: "NotFoundRecord",
          statusCode: 200,
          success: false,
        });
      } else {
        res.status(200).send({
          message: "Success",
          statusCode: 200,
          success: true,
        })
      }
    });
  } else {
    res.status(200).send({
      message: "BadREquest",
      statusCode: 400,
      success: false,
    });
  }
}

【讨论】:

  • @kianoushdortaj 然后请发布RoleController.Notfound 的代码(以及使用它的代码)。可能你在其他地方也有类似的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多