Ошибка: не удается установить заголовки после их отправки в экспресс-файл загрузки

1
app.post('/profile', function(req, res) {
    // save file
    if (req.files) {
        let sampleFile = req.files.sampleFile;
        sampleFile.mv('/somewhere/on/your/server/filename.jpg', function(err) {
            if (err)
                return res.status(500).json(err);

        });
    }
    // do some other stuff
    // .............

    res.status(200).json(result);
});

Я знаю, что проблема вызвана return res.status(500).json(err). Я могу решить проблему, переместив res.status(200).json(result) после if (err) block. Поскольку файл загрузки является необязательным, пользователь может публиковать другие данные без загрузки файлов. Мой вопрос заключается в том, как отправить статус 200 с результатом json после обработки другого материала, если решение

if (err)
    return res.status(500).json(err);
res.status(200).json(result);
  • 2
    Проблема здесь в поведении обратного вызова. Все внутри обратного вызова выполняется после other stuff и res.status(200).json(result); Это означает, что ваш .post() отправляет статус 200 и, возможно, пустой json, несмотря ни на что, затем дополнительно добавляет статус 500 сверху. Решение состоит в том, чтобы переместить все, что вы хотите сделать, если в обратном вызове нет ошибки.
  • 0
    попробуйте выполнить return res.status(200).json(result);
Показать ещё 4 комментария
Теги:
express

2 ответа

1
Лучший ответ

Как было указано выше, проблема заключается в том, что вы отправляете ответ успеха за пределы обратного вызова.

Решение заключается в том, чтобы делать "другие вещи" в обратном вызове.

Это должно решить проблему -

app.post('/profile', function(req, res) {
    // save file
    if (req.files) {
        let sampleFile = req.files.sampleFile;
        sampleFile.mv('/somewhere/on/your/server/filename.jpg', function(err) {
            if (err) return res.status(500).json(err);

            doOtherStuff();
            res.status(200).json(result);
        });
    } else {
       doOtherStuff();
       res.status(200).json(result);
    }
});

// Write a do other stuff function
function doOtherStuff() {
  // do stuff
}

EDIT Добавление ответа с Promises чтобы избежать повторения кода.

function moveFile(file, somePlace) {
  return new Promise((resolve, reject)=>{
   file.mv(somePlace, function(err) {
     if (err) return reject(err);

     resolve();
   });
  });
}

app.post('/profile', function(req, res) {
  // save file if present

  const fileMovePromise  = req.files ? 
    moveFile(req.files.sampleFile, '/somewhere/on/your/server/filename.jpg') 
    : 
    Promise.resolve('No file present');

  fileMovePromise
    .then(() => {
      // do other stuff
    })
    .catch(err => {
      res.status(500).json(err);
    });
});
  • 0
    Что делать, если пользователь не загружал файл? загрузка файла не является обязательной.
  • 0
    Оберните «делайте другие вещи в функции» и вызывайте их в обоих местах. Обновление ответа, чтобы показать, как.
Показать ещё 1 комментарий
0

Вы можете использовать форму промежуточного программного обеспечения, чтобы проверить, загружается ли пост, действие по загрузке файла перед продолжением, посмотрите на промежуточное программное обеспечение с выражением здесь: http://expressjs.com/en/guide/using-middleware. HTML

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

app.use('/profile', function (req, res, next) {
 if (req.files) {
   let sampleFile = req.files.sampleFile;
   sampleFile.mv('/somewhere/on/your/server/filename.jpg', function(err, data) {
    if (err) {
      res.status(500).json(err);
    } else {
      req.data = data
      next()
    }
 });
}
 res.status(200);
}, function (req, res) {
 res.status(500).json(req.data);
})

Если вы используете Node для выражения, параметр res содержит res.headersSent, который вы можете проверить, были ли отправлены заголовки.

if(res.headersSent) {}

Вы также можете узнать здесь намного больше: https://nodejs.org/api/http.html#http_response_headerssent

  • 0
    На данный момент я снял свое отрицательное мнение, но это не решает проблему.
  • 0
    Проблема в том, что вы просто не знаете, загружаете ли вы файл или нет, но использование промежуточного программного обеспечения для этого действительно поможет и даст лучшую структуру. Промежуточное программное обеспечение не будет продолжаться, пока вы не вызовете вызов функции Next () !, позволяющий вам загружать или отключать эту опцию!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню