0

免責事項:私はノードにかなり慣れていません(ただしJavaScriptはそうではありません)。

一度に数行をメモリに保持し、バッファが容量に達したときにディスクにフラッシュするロガークラスを作成しようとしています


問題

ロガー ラッパーを呼び出すと、バッファー ライターで例外が発生する

私はrequire()がどのように機能するかを誤解していると確信しています.また、さまざまな人が新しいchatlogs.Chatlogger()を使用してオブジェクトを作成するようにアドバイスしましたが、この方法を使用する他の多くのノードライブラリは見られません.

/www/im/node_modules/buffered-writer/lib/buffered-writer.js:125
    cb ();
        ^
TypeError: undefined is not a function
    at Writer.flush (/www/nodeim/node_modules/buffered-writer/lib/buffered-writer.js:125:3)
    at Chatlogger.close (/www/nodeim/helpers/chatlogs.js:27:14)
    at Object.<anonymous> (/www/nodeim/app.js:76:16)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3

呼び出しコード...

var chatlogs = require('./helpers/chatlogs.js'); 
var chatlogger_obj = new chatlogs.Chatlogger();

chatlogger_obj.open("logs/log.txt");
chatlogger_obj.log("TESTING");
chatlogger_obj.close();

process.exit(0);

ラッパークラス

./helpers/chatlogs.js

exports.version = '0.0.1';

var 
  buffer = require('buffered-writer'),
    fs = require('fs');

var Chatlogger = function() {
    this.handle = null,
    this.filename = "",
    this.dirtyops = 0;
}

Chatlogger.prototype.open = function (filename) {

    //fs.unlink(filename);

    this.filename = filename;
    this.handle = buffer.open(filename)
        .on ("error", function (error) {
            //this.handle = null;
            console.log (error);
        });
}

Chatlogger.prototype.close = function() {
    console.log("CLOSING");
    this.handle.flush();
    this.handle.close();
    this.handle = null;
}

Chatlogger.prototype.log = function (str) {

    console.log(str);
    this.handle.writeln(str);

    if (this.dirtyops++ > 5)
    {
        console.log("FLUSHING");
        this.handle.flush();
        this.dirtyops = 0;
    }
}

module.exports.Chatlogger = Chatlogger;
4

1 に答える 1

2

私はこのモジュールの作成者です。コールバックをフラッシュ関数に渡す必要がありますが、フラッシュを呼び出す必要はありません。buffered-writer が閉じるか、書き込み中にバッファ サイズを超えると、データは自動的にディスクにフラッシュされます。

Writer#flush(コールバック)

于 2013-07-24T07:39:24.397 に答える