错误:在express-fileupload中发送后,无法设置标题

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) 。 我可以通过在if (err)块之后移动res.status(200).json(result)来解决这个问题。 由于上传文件是可选的,用户可以发布其他数据,而不需要上传文件。 我的问题是如何处理其他的东西,如果解决scheme后发送状态200与JSON结果

 if (err) return res.status(500).json(err); res.status(200).json(result); 

正如上面指出的那样,问题在于你是否在callback之外发送成功响应。

解决办法是在callback中做“其他的东西”。

这应该解决这个问题 –

 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 } 

编辑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); }); }); 

您可以使用中间件的一种forms来检查文章是否正在上传文件,继续之前的file upload的行为,看看中间件与快递在这里: 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来expression,res参数包含res.headersSent,你可以检查头是否已经被发送。

 if(res.headersSent) {} 

您还可以在这里find更多: https : //nodejs.org/api/http.html#http_response_headerssent