Nodejs: ошибка при отправке ответа перед использованием всех данных запроса - PullRequest
1 голос
/ 06 января 2020

Я использую multer для хранения файлов. Для этого у меня есть POST-маршрут с промежуточным программным обеспечением для аутентификации. Получаемый запрос - это multipart / form-data (файл и другие текстовые поля).

let upload = multer({ storage, fileFilter: validateRequest }).single("file");

//The validateRequest function in fileFilter validates the request.

router.post("/", auth,(req, res) => {
upload(req, res, async err => {
    //code for uploading follows
}

А вот и промежуточное ПО аутентификации

function(req, res, next) {
  const token = req.header("x-auth-token");

  if (!token) return res.status(401).send("Access denied. No token provided");

  try {
    const decoded = jwt.verify(token, config.get("privateKey"));
    req.user = decoded;
    next();
  } catch (err) {
    res.status(400).send("Invalid token");
  }
};

Теперь проблема в том, чтобы вызвать этот маршрут без действительного заголовка токена (x-auth-token) приводит к ответу об ошибке H18 «Запрос сервера прерван» на Heroku (отлично работает на локальной машине!).

Вкл С другой стороны, если я удаляю файл из запроса multipart / form-data, все работает хорошо.

Эта ошибка генерируется, потому что (на мой взгляд) запрос слишком велик и отправляется ответ перед использованием всего запроса.

Итак, пока, в качестве временного обходного пути, я удалил промежуточное ПО аутентификации и поместил код аутентификации в функцию fileFilter (validateRequest), чтобы весь входящий поток был полностью обработан. перед отправкой какого-либо ответа.

Ошибка исчезла, но теперь функция validateRequest пахнет .

Есть ли способ использовать промежуточное программное обеспечение аутентификации, как раньше и делать все связанные с аутентификацией вещи только там?

Вот аналогичный ответ , описывающий проблему как старую ошибку nodejs без исправления.

...