簡體   English   中英

node.js / express:發送標頭后無法設置標頭

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM