【问题标题】:How to export a variable which is updated within a callback function in Node.js如何导出在 Node.js 的回调函数中更新的变量
【发布时间】:2014-06-30 01:17:08
【问题描述】:

我是 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 中具有正确的值?

【问题讨论】:

  • AFAIK,readFile 是异步的,所以你的日志不会工作。您应该将回调函数传递给 testExport.js 中的 readFile 方法。
  • @blessenm,你能给我一个如何使用回调的例子吗?我在几个地方见过它,但我无法正确实施。

标签: javascript node.js


【解决方案1】:

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

var fs = require('fs')

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

【讨论】:

  • 这只是一个展示问题的小例子。我实际上是在阅读内容,对其进行操作,然后将其存储在另一个需要导出的数据结构中。所以,我不确定 readFileSync() 是否适合我。另外,我要处理的文件非常大,所以我不想使用 readFileSync()
  • 如果你最终缓冲整个文件有什么区别(你已经在为整个文件做module.exports.buffer+=d.toString())?无论哪种方式,整个文件都将存储在内存中。如果您正在将某种逐块翻译成非字符串/缓冲区形式(例如 js 对象或数字),那么这是完全不同的。在这种情况下,您需要在函数中接受回调,并在转换完成后调用它。
【解决方案2】:

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

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 中获得完整的流。

【讨论】:

  • 我不知道为什么有人反对这个,对我来说是正确的。 +1
  • 我也是这么想的。否决投票过程需要迫使人们发表评论或其他事情。感谢您的 +1。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多