我有一个nodejs客户端将大约200k的文本文件流式传输到服务器nodejs应用程序,该应用程序将信息保存在mongodb表中。
它适用于小文件,但是使用大文本文件时,服务器会多次从...中收到数据'流式传输一个唯一文件,就好像服务器将文件分成几块并打开170k一样文件流,mongodb中的3个条目,当我只想要一个。
感谢您的帮助
这是服务器:
var net = require('net'),
fs = require('fs'),
buffer = require('buffer');
var server = net.createServer(function(conn) {
console.log('server connected');
});
var HOST = '127.0.0.1';
var PORT = '9001';
// DB Config
var databaseUrl = "logserver";
var collections = ["logs"]
var db = require("mongojs").connect(databaseUrl, collections);
server.listen(PORT, HOST, function() {
//listening
console.log('Listening on port ' + PORT + '\n');
server.on('connection', function(conn) {
var current_time = Date.now();
console.log('connection made...\n')
conn.on('data', function(data) {
console.log('data received from ' + conn.remoteAddress);
db.logs.save({log_timestamp: current_time, client_ip: conn.remoteAddress, log_data: data.toString('utf8')}, function(err, saved) {
if( err || !saved ) console.log("- Log not saved -");
else console.log("- Log saved -");
});
});
})
});
这是客户:
var net = require('net');
var fs = require('fs');
var PORT = 9001;
var HOST = '127.0.0.1';
var FILEPATH = 'file.txt';
var client = new net.Socket()
//connect to the server
client.connect(PORT,HOST,function() {
'Client Connected to server'
//send a file to the server
var fileStream = fs.createReadStream(FILEPATH);
fileStream.on('error', function(err){
console.log(err);
})
fileStream.on('open',function() {
console.log('Sending log file...');
fileStream.pipe(client);
});
});
//handle closed
client.on('close', function() {
console.log('Connection finished')
});
client.on('error', function(err) {
console.log(err);
});
答案 0 :(得分:2)
由于TCP的工作方式,文件被分成块,因此您无法完全阻止它。您可以做的是重新组装另一侧的文件。这是一个简单的方法:
var chunks = [];
conn.on('data', function(chunk) {
chunks.push(chunk);
});
conn.on('end', function() {
var data = Buffer.concat(chunks);
db.logs.save(...);
});