Невозможно экспортировать функцию - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь использовать функцию:

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 / пользователи / 203 404 17,862 мс - 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) at exports.get (/home/qt/dev/BigDealExpressJSTest/controllers/userController.js:28:7) (узел: 20775) UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch (). (идентификатор отклонения: 1) (узел: 20775) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания устарело. В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом выхода.

1 Ответ

1 голос
/ 13 июня 2019

Это неправильно по нескольким причинам:

Первый:

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)

...