簡體   English   中英

node.js表達錯誤:發送標頭后無法設置標頭

[英]nodejs express Error: Can't set headers after they are sent

我正在用nodejs讀取一個不斷增長的文件。 在我的app.js中使用以下代碼。

app.post('/readfile',function (req,res) {   
    var fullfilename = req.body.filepath+"\\"+req.body.filename;
    var bite_size = 256;
    var readbytes = 0;
    var file;

    fs.open(fullfilename, 'r', function(err, fd) {
        file = fd;      
        if(err){console.log(err); throw err; return;};
        var mybuff;
        var func = (function readsome() {               
        var stats = fs.fstatSync(fd); // yes sometimes async does not make sense!
                if(stats.size<readbytes+1) {                    
                    setTimeout(readsome, 1000);
                }
                else {
                    fs.read(fd, new Buffer(bite_size), 0, bite_size, readbytes, function (err, bytecount, buff) {
                    //console.log(buff.toString('utf-8', 0, bytecount));
                    res.json(buff.toString('utf-8', 0, bytecount));
                    readbytes+=bytecount;
                    process.nextTick(readsome);
                    });
                };          
        })();           
    }); 
}); 

然后像下面這樣在html中調用它,

var myApp= angular.module("myApp", [])
myApp.controller('Ctrl1', function ($scope, $http,$q) {
        var FileName = "test.txt"
        var obj = {"filepath" : 'D:\\Temp', "filename" : FileName};

        $http({
                url: '/readTfile',
                method: "POST",
                data: JSON.stringify(obj)
                //timeout: canceller.promise,
                //headers: {'Content-Type': 'application/json','charset' : 'utf-8'}
                }).success(function(result) {               
                $scope.myfiledata = result;                     
                }).error(function(data, status) {
                console.log(data);
                }); 
});

當我將這個app.js代碼放在一個單獨的文件(readfile.js)中時,此方法工作正常,但是當我將app.js放入它時,它給出了錯誤。

_http_outgoing.js:357
    throw new Error('Can\'t set headers after they are sent.');
    ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)
    at ServerResponse.header (D:\myapp\node_modules\express\lib\response.js:725:10)
    at ServerResponse.send (D:\myapp\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (D:\myapp\node_modules\express\lib\response.js:256:15)
    at D:\myapp\app.js:130:10
    at FSReqWrap.wrapper [as oncomplete] (fs.js:682:17)
[nodemon] app crashed - waiting for file changes before starting...

請幫助找出錯誤所在和要更改的內容。 其次,我想在單擊按鈕時停止此呼叫,我該怎么做?

這只是一個猜測,但是,在app.js中添加代碼之前,您是否刪除了舊代碼?

也許您的/ readfile路由是同時由app.js和在單獨的文件中添加的,所以第一個路由發送響應,而當第二個路由開始執行響應時,它會得到已經發送響應的錯誤。

您只能在請求中調用一次res.json 它設置相關的標頭,JSON對數據進行編碼,將其作為響應發送,然后結束請求。

如果您只想寫一些數據,可以使用writehttps : //nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

也許您可以使用管道系統代替它來完成所有工作?

var readStream = fs.createReadStream(fullfilename);
readStream.pipe(res);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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