2014-03-01 27 views
0

我有一個客戶端的NodeJS流的200K左右的文本文件的應用程序的NodeJS服務器節省在MongoDB的表中的信息。流大的文本文件到服務器的NodeJS

這是工作好小文件,但使用大的文本文件時,服務器說,「從接收到的數據......」幾次流一個唯一的文件,就像如果服務器打破件文件,然後在打開170k文件流,3個條目在MongoDB中,當我只想要一個。

感謝您的幫助

這是服務器:

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); 
}); 

回答

2

的文件被劃分成塊,因爲TCP是如何工作,所以你不能完全防止它。你可以做的是在另一邊重新組裝文件。這是一個簡單的方法:

var chunks = []; 
conn.on('data', function(chunk) { 
    chunks.push(chunk); 
}); 
conn.on('end', function() { 
    var data = Buffer.concat(chunks); 
    db.logs.save(...); 
}); 
+0

它的工作,謝謝。這樣做很好嗎?或者你認爲可以用其他方式做得更好? – codiaf

+0

據我所知,這是處理塊的一種相當標準的方法。我不認爲Mongo有任何'$ append'操作符,所以它是我能想到的唯一選項。 – ZachRabbit

相關問題