使用 restify 模块时,在发送节点 js 后无法设置 headers

can't set headers after they are sent node js when using restify module

我已经使用繁琐的方式连接到 sql 服务器并为 restful api restify 这是 server.js

server.get('/getInvoiceData', function (req, res, next) {
    repository.GetInvoiceData(function(data){
        res.send(data);
        next();
    });
});

和invoice.js

exports.GetInvoiceData = function(callback){
    var query = "SELECT * FROM [Snapdeal].[dbo].[tbl_Configuration]";
    var req = new request(query,function(err,rowcount){
        if (err)
        {
            console.log(err.toString());
        }else{
            console.log(rowcount+ " rows");
        }
    });
    req.on('row',function(){
        callback({customernumber:123});
    });
    connection.execSql(req);
}

我收到错误消息,因为发送后无法设置 headers。

我不是 100% 确定,因为我不熟悉你正在使用的 SQL 库,但是,在我看来问题是你的 row 事件会被引发 每行,而不是每笔交易。

您将在第一个 row 事件之后结束响应,因此如果返回多行,则响应已经关闭(因此出现错误)。

处理此问题的一种方法是在检索行数据时累积行数据,然后然后在完成后引发回调


现在您已经说明了您正在使用的库 (Tedius),看来我的预感是正确的。查看库,这是在单个回调中返回所有行的最简单方法

exports.GetInvoiceData = function(callback){
    var query = "SELECT * FROM [Snapdeal].[dbo].[tbl_Configuration]";
    var req = new request(query,function(err, rowcount, rows){
        if (err) {
            console.log(err.toString());
        } else{
            callback(rows);
        }
    });
    connection.execSql(req);
}

注意 - 请记住将 config.options.rowCollectionOnRequestCompletion 设置为 true 否则 rows 参数将为空。

我使用 mssql 的问题是我有一个默认值或绑定集(在本例中为 (getdate()))到我的一个列(修改日期列)。但是,我试图检索的数据为此特定列预设了 NULL 值。

我将数据放入这些行中,一切顺利。