代码之家  ›  专栏  ›  技术社区  ›  David

节点。js/express:发送邮件后无法设置邮件头

  •  2
  • David  · 技术社区  · 7 年前

    尽管网上有很多关于这个主题的问题和文章,但似乎都不适用于我的特定应用程序。

    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呢?

    非常感谢您提前查看此内容。

    1 回复  |  直到 7 年前
        1
  •  4
  •   peteb    7 年前

    使用时 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!");
            })
    })