无法导出功能

时间:2019-06-13 08:22:07

标签: node.js express promise es6-promise

我尝试使用功能:

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 ms-90

  

(节点: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()无法处理的承诺。 (拒绝ID:1)   (节点:20775)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

1 个答案:

答案 0 :(得分:1)

这是错误的,原因有几个:

第一

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

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

现在是出于真实原因:

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

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

即。

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)=>{.. do something })

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