[英]node.js socket response order and recover socket hang up
通過套接字連接查詢帶有node.js的sqlite3數據庫時,我遇到以下兩個問題:
用node.js http客戶端我請求一個node.js http服務器,結果的序列被混淆了
我不時會掛斷一個socket,它是不可復制的
這是服務器代碼:
var http = require('http');
var url = require('url');
var sqlite3 = require('sqlite3').verbose();
var counter = 0;
//create sqlite database for testing
var db = new sqlite3.Database("db.sqlite3");
db.serialize(function() {
db.run("DROP TABLE IF EXISTS test");
db.run("CREATE TABLE IF NOT EXISTS test (ID INTEGER)");
var stmt = db.prepare("INSERT INTO test VALUES (?)");
for (var i = 1; i <= 10; i++) {
stmt.run(i);
}
stmt.finalize();
});
db.close();
//run server
http.createServer(function (req, res) {
var queryData = url.parse(req.url, true).query;
res.writeHead(200, {"Content-Type": "text/plain; charset=utf-8"});//, "connection": "keep-alive"
var db = new sqlite3.Database(new Buffer(queryData.SQLServerAddress, "base64").toString('utf8'));
db.serialize(function() {
db.each(new Buffer(queryData.SQLStatement, "base64").toString('utf8'), function(err, row) {
counter++;
console.log(counter + " / " + JSON.stringify(row));
res.end(JSON.stringify(row).toString());
});
});
db.close();
counter = 0;
}).listen(1337, '127.0.0.1');
console.log('Server running...');
這是客戶端代碼:
var http = require('http');
for(i=1;i<=10;i++){
var SQLServerAddress = new Buffer("db.sqlite3").toString('base64');
var SQLStatement = new Buffer("SELECT * FROM test WHERE ID=" + i).toString('base64');
var options = {
host: "127.0.0.1",
port: 1337,
path: "/?SQLServerAddress=" + SQLServerAddress + "&SQLStatement=" + SQLStatement
};
callback = function(response){
var str = "";
response.on("data", function (chunk){
str += chunk;
});
response.on("end", function (){
console.log(str);
});
}
http.request(options, callback).end();
}
我重復這個請求10次作為“壓力測試”,有點......
所以我在控制台收到的是例如
服務器端控制台:
1 / {"ID":1}
2 / {"ID":2}
3 / {"ID":5}
4 / {"ID":4}
1 / {"ID":3}
2 / {"ID":6}
1 / {"ID":7}
2 / {"ID":9}
3 / {"ID":10}
4 / undefined
和客戶端控制台:
{"ID":1}
{"ID":2}
{"ID":5}
{"ID":4}
{"ID":3}
{"ID":6}
{"ID":7}
{"ID":9}
{"ID":10}
events.js:68
throw arguments[1]; // Unhandled 'error' event
^
Error: socket hang up
at createHangUpError (http.js:1263:15)
at Socket.socketCloseListener (http.js:1314:23)
at Socket.EventEmitter.emit (events.js:123:20)
at Socket._destroy.destroyed (net.js:357:10)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)
我的問題是:
提前致謝!
Node.js是一個基於異步事件的環境。
因此,運行調用函數的for循環只是將這些函數添加到處理隊列中,但不等待它們完成。
因此,您的所有請求都是並行啟動的,並且無法保證將首先結束/傳輸。 如果您想保證訂單,您必須同步傳輸請求。 下面的代碼是未經測試的,但你應該明白這一點,只有在一個請求結束后,下一個請求才會啟動(這不會放在for循環中)。
var count = 0;
callback = function(response){
var str = "";
response.on("data", function (chunk){
str += chunk;
});
response.on("end", function (){
if (count++ < 10){
http.request(options, callback).end();
}
console.log(str);
});
}
http.request(options, callback).end();
不幸的是,我不確定什么是從套接字掛起錯誤中恢復的最佳方法,但你可以嘗試使用try / catch包圍http.request方法,如果前一個引發錯誤,只需啟動一個新請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.