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);
Как было указано выше, проблема заключается в том, что вы отправляете ответ успеха за пределы обратного вызова.
Решение заключается в том, чтобы делать "другие вещи" в обратном вызове.
Это должно решить проблему -
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);
});
});
Вы можете использовать форму промежуточного программного обеспечения, чтобы проверить, загружается ли пост, действие по загрузке файла перед продолжением, посмотрите на промежуточное программное обеспечение с выражением здесь: 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
other stuff
иres.status(200).json(result);
Это означает, что ваш.post()
отправляет статус 200 и, возможно, пустой json, несмотря ни на что, затем дополнительно добавляет статус 500 сверху. Решение состоит в том, чтобы переместить все, что вы хотите сделать, если в обратном вызове нет ошибки.return res.status(200).json(result);