【问题标题】:Can not export function无法导出功能
【发布时间】:2019-10-27 19:11:52
【问题描述】:

我尝试使用函数:

exports.get = async function (req, res, next) {
  filter.validateId(req,res,next);
  const db = req.app.get('db');
  let id = req.params.id;
  let user;
  try {
    user = await db.models.user.findByPk(id);
  } catch (err) {
    res.send(400)
  }
  res.json(user);
};

和导出函数:

var validateId = function (req, res, next) {
  let id = parseInt(req.params.id);
  if (isNaN(id) || id <= 0) {
      res.send(400);
  }
  res.locals.id = id;

  return next();
};
exports.validateId=validateId;

但我得到了错误:

GET /users/203 404 17.862 毫秒 - 90

(node:20775) UnhandledPromiseRejectionWarning: 错误 [ERR_HTTP_HEADERS_SENT]: 发送到客户端后无法设置标头 在 ServerResponse.setHeader (_http_outgoing.js:470:11) 在 ServerResponse.header (/home/qt/dev/BigDealExpressJSTest/node_modules/express/lib/response.js:767:10) 在 ServerResponse.send (/home/qt/dev/BigDealExpressJSTest/node_modules/express/lib/response.js:170:12) 在 ServerResponse.json (/home/qt/dev/BigDealExpressJSTest/node_modules/express/lib/response.js:267:15) 在exports.get (/home/qt/dev/BigDealExpressJSTest/controllers/userController.js:28:7) (节点:20775)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝编号:1) (节点:20775)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

【问题讨论】:

  • 错误Cannot set headers after they are sent 是因为您发送了两次响应,可能是先在validateId 上,然后是res.json(user)
  • 好的,我修复 if,但现在我收到错误 UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:21582) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

标签: node.js express promise es6-promise


【解决方案1】:

这是错误的有几个原因:

第一:

if (isNaN(id) || id <= 0) {
      res.send(400); //return res.send(400);
}

需要添加return,这样即使在发送响应后next()也不会被调用。

现在是真正的原因:

validateId 中,您正在传递get 函数的next。因此,每当您从 validateId 调用 next 时,您实际上是在调用 nextget,从而将控制权发送到下一个中​​间件。

因此,您需要从 get 函数中删除 filter.validateId(req,res,next); 行并将其添加为第二个中间件。

即。

exports.get = async function (req, res, next) {
  const db = req.app.get('db');
  let id = req.params.id;
  let user;
  try {
    user = await db.models.user.findByPk(id);
  } catch (err) {
    res.send(400)
  }
  res.json(user);
};

app.get('/route', validateId, get , (req,res)=&gt;{.. do something })

app.get('/route', validateId, get)

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多