如何导出在Node.js中的回调函数内更新的变量

时间:2014-06-29 10:49:20

标签: javascript node.js

我是Node.js的新手,在尝试一些基本代码时,我遇到了需要帮助的问题。 我有一个模块example2.js,它读取文件的内容,我想导出一个变量,它将包含行文件的所有内容,我试图从testExport.js访问

以下是文件内容。

example2.js

var fs = require('fs')
var stream = fs.createReadStream('S1.dat', {flags: 'r', encoding: 'utf-8'});
var buf = "";

module.exports.buffer = buf ;

exports.readFile = function f() {
    stream.on('data', function(d) {
        module.exports.buffer+=d.toString();
        console.log( "Inside function " +  module.exports.buffer );
    });

};

testExport.js

var e2 = require ('./example2.js');
e2.readFile();
console.log ("From external file" + e2.buffer);

我应该如何导出它,以便缓冲区在testExport.js中具有正确的值?

3 个答案:

答案 0 :(得分:1)

您可以使用fs.readFileSync()加载文件一次:

var fs = require('fs')

exports.buffer = fs.readFileSync('S1.dat', { encoding: 'utf8' });

答案 1 :(得分:1)

由于Buffer在更新时没有自己的事件通知,您希望将回调传递给readFile。这是一个选择。

example2.js

var fs = require('fs')
var stream = fs.createReadStream('S1.dat', {flags: 'r', encoding: 'utf-8'});
var buf = "";

module.exports.buffer = buf ;   

exports.readFile = function f(callback) {
    stream.on('data', function(d) {
        module.exports.buffer+=d.toString();
        console.log( "Inside function " +  module.exports.buffer );
        callback(module.exports.buffer);
    });

};

testExport.js

var e2 = require ('./example2.js');
e2.readFile(function(buffer) {
    console.log ("From external file" + e2.buffer);
});

答案 2 :(得分:0)

我不确定你要做什么。但这是我之前评论过的一个例子。

readFile.js

var fs = require('fs');

exports.read = function f(file, onData, onEnd) {
    var stream = fs.createReadStream(file, {flags: 'r', encoding: 'utf8'});
    stream.on('data', onData);    
    stream.on('end', onEnd);
};

testExport.js

var readFile = require('./readFile');
var buffer = '';
var chunkCount = 0;

readFile.read('data.json', function(chunk) {
    chunkCount++;
    buffer += chunk;
}, function() {
  console.log(buffer);
  console.log('Reading Completed. Chunk Count:' +chunkCount);
});

正如您所看到的,readFile只是读取您指定的文件并流式传输到您提供的回调。你可以在回电中做任何你想做的事情。如果文件很大,可以多次调用onData。因此,我们只会在onEnd中获得完整的信息流。