【问题标题】:Closures to get variable in node.js在 node.js 中获取变量的闭包
【发布时间】:2013-07-23 12:47:47
【问题描述】:

我正在开发用于获取闭包变量的论文软件。

这是我在 node.js 中的代码

var kepala = express.basicAuth(authentikasi);
// authenticate for login 

function authentikasi(user, pass, callback) {
    // declrare my database mongodb
    db.collection('ak_teacher', function (err, data) {
        data.findOne({
            'tch_name': {
                '$regex': user
            }
        }, function (err, level) {

            console.log(level); // monitor data

            if (level == null) {
                console.log('Nilai database kepala sekolah masuk Null ulangi login');
                callback(null);
            } else {

                var a = level.tch_name;
                var b = level.tch_password;

                var c = level.sch_id; // (i need this variable for next code) 

                var result = (user === a && pass === b);
                console.log("id Sekolah : " + c);
                callback(null /* error */ , result);
            }
        });
    });
};

var tes = authentikasi(); // (in here i dont know declare for get my variable c)

app.get('/siswa_2', kepala, function (req, res) {
    // i use variable in here                            
    var sch_id = tes;
    console.log("id school in query :" + sch_id);
    console.log('Menampilkan Seluruh data Siswa');
    db.collection('ak_student', function (err, collection) {
        collection.find({
            "sch_id": sch_id
        }).toArray(function (err, items) {
            console.log(items);
            res.send(items);

        });
    });
});

我正在尝试获取变量c

【问题讨论】:

  • 那是一个格式非常糟糕的代码...
  • 你需要什么闭包?什么函数中的什么变量?
  • 还有一个人想要从异步代码中返回一个值。本周我已经回答了三个类似的问题,我这样做只是因为我厌倦了将这样的问题作为重复的问题结束,因为找到我喜欢的答案比简单地回答问题更难。我们需要一个好的、众所周知的社区答案。
  • 我在 node.js 中的代码我使用的是 framework express
  • 请帮我获取变量 c 以在 var tes 中使用..我不知道使用逻辑来获取它..

标签: javascript node.js mongodb authentication express


【解决方案1】:

您还需要将c 传递给回调以获取它的值:

callback(null /* error */, result, c);

然后像这样调用authentikasi

// Note, since this callback is called by passing "c"
// as the third argument, this is how we assign it to "tes"
//                                             |
//                                             |
//                                             V
authentikasi(user,pass,function(unused,result,tes) {
  app.get('/siswa_2', kepala, function(req, res) {
    var sch_id = tes;
    console.log("id school in query :" +sch_id);
    console.log('Menampilkan Seluruh data Siswa');
    db.collection('ak_student', function(err, collection) {
      collection.find({"sch_id":sch_id}).toArray(function(err, items) {
        console.log(items);
        res.send(items);
      });
    });
  });
});

【讨论】:

  • 请等我现在试试
  • hmmm 我正在尝试但错误.. 用户,传递未定义的身份验证我用于登录我正在登录但我需要变量 c 用于在 get /siswa 中声明下一个我的代码
  • 函数看起来像这样:function authentikasi (user, pass, callback) {} 这意味着它希望你传递一个用户名字符串、一个密码字符串和一个回调函数。将其称为authentikasi() 根本没有意义。这实际上是关于函数如何在任何语言中工作的基本编程知识。如果您甚至不理解这一点,我看不出有人会期望您编写需要匿名函数、闭包、异步/面向事件的编程等知识的 javascript。
  • 对不起所有其他stackoverflow成员,但我用马来语写这个以确保没有误解:对不起tapi“我正在登录”tu tak betul。 Code ni tak akan login sebab anda tak beri username dan password kepada function authentikasi untuk dibandingkan dengan level.tch_name dan level.tch_password.
  • 我正在使用本教程:[blog.modulus.io/nodejs-and-express-basic-authentication] 我的代码中的单路由身份验证有数据库 mongodb 我使用用户名和密码.. 在我的数据库中我有 var c = sch_id (school id)我正在为我的下一个声明 var c 获取它。我在关闭获取变量 c 时遇到了麻烦,请帮助我。
【解决方案2】:

根据the docs,您应该使用用户对象进行回调。您可以简单地将您的 c 变量放在那里:

var kepala = express.basicAuth(authentikasi);

function authentikasi(user, pass, callback) {
    // declrare my database mongodb
    db.collection('ak_teacher', function (err, data) {
        data.findOne({
            'tch_name': {
                '$regex': user
            }
        }, function (err, level) {
            console.log(level); // monitor data

            if (level == null) {
                console.log('Nilai database kepala sekolah masuk Null ulangi login');
                callback(null);
            } else {
                var a = level.tch_name;
                var b = level.tch_password;
                var c = level.sch_id; // (i need this variable for next code) 

                if (user === a && pass === b) {
                    console.log("id Sekolah : " + c);
                    callback(null, {name: a, id: c});
//                                 ^^^^^^^^^^^^^^^^
                } else
                    callback(null, false);
            }
        });
    });
};
// don't try to authenticate outside of the request context

app.get('/siswa_2', kepala, function (req, res) {
    var sch_id = req.user.id;
//               ^^^^^^^^^^^
    console.log("id school in query :" + sch_id);
…
});

【讨论】:

  • 你是天才 ^_^ 谢谢兄弟,我正在工作 2 天这个代码我很困惑你是天才.. 上帝保佑你的朋友
【解决方案3】:

您也可以利用locals

响应局部变量的作用域是请求,因此只有 可用于该请求/响应期间呈现的视图 循环,如果有的话。否则此 API 与 app.locals 相同。

此对象对于公开请求级信息很有用,例如 请求路径名、经过身份验证的用户、用户设置等。

c 分配给res.locals.c 应该可以让您在该特定请求的后续元素和后续响应中使用它。

【讨论】:

  • 感谢您的回答。我需要在我的数据库 ak_teacher 中使用变量 id school 来通过 id school 声明我的代码搜索。我无法在 ak_teacher 中获取变量 C = sch_id ..
  • res.locals.id = level.sch_id; 这将允许您稍后在请求/响应处理中使用 id 作为res.locals.id
猜你喜欢
  • 2016-01-28
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多