0

node.js を使用して、socket.io は onRegister() を呼び出して、ユーザーの mongoDB をチェックします。しかし、DB コールバック関数は事前定義されています。コールバック パラメータに 'this' (ioHandle) を追加するにはどうすればよいですか?

function onRegister(data) {
    var name,pass,room;
    name = data.name;
    pass = data.pass;
    ioHandle = this;

    Mongo.connect('mongodb://127.0.0.1:27017/main', function(err, db, ioHandle) { // wrong
        if(err) throw err;
        var collection = db.collection('users');

        // does user exist
        collection.findOne({name : name}, function(err, doc, ioHandle) { // wrong
            if(err) throw err;
            if(doc) {
                log("User already exists");
                ioHandle.emit(NGC_REGISTER_RESULT, {NGC_REJECT:"User already Exists"}); // ioHandle undefined
            } else {
                // create new user
                log("User not found");
                ioHandle.emit(NGC_REGISTER_RESULT, NGC_ACCEPT); // ioHandle undefined
            }
            db.close();
        });
    });
}

エラー: ioHandle が渡されていません

TypeError: Cannot call method 'emit' of undefined
4

1 に答える 1

0

コールバック関数に追加ioHandleする必要はありません。通常の JavaScript クロージャ メカニズムを通じて、その関数のスコープ内になります。findOneioHandle

function onRegister(data) {
    // ioHandle will be visible to everything inside this function,
    // that includes the callback and nested callback below.
    var ioHandle = this;
    //...

    Mongo.connect('mongodb://127.0.0.1:27017/main', function(err, db) {
        //...
        collection.findOne({name : name}, function(err, doc) {
            // Use ioHandle as normal in here
            //...

MDN 閉鎖ページに少し時間を費やすことをお勧めします。

于 2013-09-01T05:28:25.273 に答える