[英]node.js/express: Can't set headers after they are sent
盡管在線上有大量關於此主題的stackoverflow問題和文章,但似乎沒有一個適用於我的特定應用程序。
router.get('/getFile', (req, res) => {
console.log("Calling getFile for file " + req.query.serialNumber + ".")
var serialNumber = req.query.serialNumber;
let request = new sql.Request(conn);
request.query('SELECT FileName + \'.\' + FileExtension AS \'File\', FileType, ContentType, SerialNumber, Chart ' +
'FROM dbo.ChangeFiles ' +
'WHERE SerialNumber = ' + serialNumber)
.then(function (recordset) {
log("Successfully retrieved file " + recordset[0].SerialNumber + " from database.")
res.writeHead(200, {
'Content-Type': recordset[0].ContentType,
'Content-disposition': 'attachment;filename=' + recordset[0].File
});
res.send(Buffer(recordset[0].Chart));
}).catch(function (err) {
log(err);
res.send("Issue querying database!");
});
});
我似乎無法弄清楚如何正確更改標題,以便在res.send命中之前完成更改。 這很可能是由於javascript的異步特性所致,我仍然有待正確掌握一些東西,但是如何確保在res.send之前調用res.writeHead?
提前非常感謝您查看此內容。
使用res.writeHead()
,標頭會立即發送到請求者。 由於您使用的是Express函數res.send()
, 它也通過您的標頭發送 ,因此它們已經發送完畢,您會收到一條錯誤消息,說明標頭已經發送完畢。 另外,您可以使用res.end()
,它不會導致標頭發送錯誤,因為它將最終確定響應並發送任何剩余的塊傳遞給它。
如何確保在res.send之前調用res.writeHead?
如果要使用res.send()
,請將res.writeHead()
調用更改為res.setHeader()
以在響應對象上設置標頭值。 此外,使用Express時,可以使用res.status(<statusCode>)
設置響應的status
。
我注意到的另一件事是您使用Buffer
。 你應該改變你的Buffer
創作從成功響應處理程序Buffer()
來Buffer.from()
作為Buffer()
被棄用 。
router.get('/getFile', (req, res) => {
console.log("Calling getFile for file " + req.query.serialNumber + ".")
let serialNumber = req.query.serialNumber
let request = new sql.Request(conn)
let query = 'SELECT FileName + \'.\' + FileExtension AS \'File\', FileType, ContentType, SerialNumber, Chart ' +
'FROM dbo.ChangeFiles ' +
'WHERE SerialNumber = ' + serialNumber
request.query(query)
.then(recordset =>{
console.log("Successfully retrieved file " + recordset[0].SerialNumber + " from database.")
let {ContentType, Chart File} = recordset[0]
// Set Response Status and Headers
res.status(200)
res.setHeader('Content-Type', ContentType)
res.setHeader('Content-Disposition', `attachment;filename=${File}`)
return res.send(Buffer.from(Chart))
}).catch(err => {
console.log(err);
return res.status(500).send("Issue querying database!");
})
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.