使用时
res.writeHead()
标头会立即发送给请求者。因为你在使用Express函数
res.send()
,
which also sends over your headers
,它们已被发送,您将收到一个错误,说明标头已发送。或者,您可以使用
res.end()
这不会导致headers sent错误,因为它将完成响应并发送剩余的块传递给它。
如何确保在res.send之前调用res.writeHead?
如果你要使用
res.send()
,更改您的
res.writeHead()
呼叫
res.setHeader()
设置响应对象的标题值。此外,使用Express时,您可以设置
status
使用
res.status(<statusCode>)
.
我注意到的另一件事是你使用
Buffer
. 你应该改变你的
缓冲器
从成功响应处理程序中创建
Buffer()
到
Buffer.from()
像
缓冲区()
是
deprecated
.
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!");
})
})