【问题标题】:How to pass a variable to a predefined callback function in node.js如何将变量传递给 node.js 中的预定义回调函数
【发布时间】:2013-09-01 04:58:05
【问题描述】:

使用 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

【问题讨论】:

    标签: javascript node.js mongodb socket.io


    【解决方案1】:

    您无需将ioHandle 添加到findOne 回调函数中,ioHandle 将通过正常的 JavaScript 闭包机制在该函数的范围内:

    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 closures page 上花点时间。

    【讨论】:

    • 啊,我花了几个小时浏览闭包教程,最后将 Mongo.connect 包含在一个 (function() ...)(ioHandle) 中 - 这很有效,所以我学到了一些东西,然后我发现多亏了你,如果我在 ioHandle 前面有一个“var”,它自然会被封闭起来。哎呀! - 干杯!
    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2019-10-08
    • 2021-07-26
    相关资源
    最近更新 更多