【问题标题】:can't set headers after they are sent node js when using restify module使用restify模块时发送节点js后无法设置标头
【发布时间】:2015-02-06 13:24:05
【问题描述】:

我已经用繁琐的方式连接到 sql server 并为 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);
}

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

【问题讨论】:

  • 您在res.send(data) 之后拨打了next()。调用send后,您已经发送了响应,因此无需调用next
  • @RodrigoMedeiros 这是文档指定的执行方式。

标签: javascript node.js restify


【解决方案1】:

我不是 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 参数将为空。

【讨论】:

  • 它仍然只是打印控制台上的行数,但浏览器没有得到任何输出。是的,但错误已解决,现在我没有在浏览器上获得输出
  • @PrateekDhuper 您正在使用更新的示例?根据文档,rows 参数返回行数据,因此您无需显式侦听row 事件。
  • @James 使用你的这个更新示例,我将行数设为 145,但行数 =[]
  • @PrateekDhuper 只需重新读取docs,您需要将config.options.rowCollectionOnRequestCompletion 选项设置为true 以使rows 参数可用。我在答案中添加了注释。
【解决方案2】:

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

我将数据放在这些行中,我很高兴。

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多