【问题标题】:Stream big text file to server nodejs将大文本文件流式传输到服务器 nodejs
【发布时间】:2014-03-01 00:13:16
【问题描述】:

我有一个 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);
});

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    由于 TCP 的工作方式,文件被分成多个块,所以你不能完全阻止它。您可以做的是在另一边重新组装文件。这是一个简单的方法:

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

    【讨论】:

    • 它有效,谢谢。这样做很好吗?还是您认为可以通过其他方式做得更好?
    • 据我所知,这是一种相当标准的处理块的方式。我认为 Mongo 没有任何类型的 $append 运算符,所以这是我能想到的唯一选择。
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 2018-04-02
    • 2023-03-17
    • 2017-04-05
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2017-01-21
    相关资源
    最近更新 更多