[英]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對數據進行編碼,將其作為響應發送,然后結束請求。
如果您只想寫一些數據,可以使用write
: https : //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.