1

我正在用 express 编写后端 javascript,但由于某种原因,我的函数在调用时未定义。它看起来像这样:

//快递路线如下所示:

exports.check = function(req, res) { //check if username is in database
    var my_result = authenticator(req); //authenticator is defined below
    console.log(typeof(authenticator(req))); //returns undefined
};

function authenticator(req) {
    var mongoose = require('mongoose');
    var db = mongoose.createConnection('localhost', 'users');
    db.once('open', function callback() {
        var personschema = mongoose.Schema({
            username: String,
            password: String
        })
        var person1 = db.model('personcollection', personschema)
        person1.find({
            username: req.body.username,
            password: req.body.password
        }, function(err, obj) {
            if (obj.length === 0) {
                return "yay";
            } else {
                return "neigh";
            }
        } //end function

当我把它放在 express 路由中时,该函数本身就可以工作,但我想用尽可能少的代码保持路由的美观。这是一个选择吗?

谢谢你的帮助。

4

2 回答 2

3

欢迎来到美妙的 JavaScript 异步世界 :)
还有更重要的 Node.js 世界。

发生这种情况是因为 Node 中的网络无法同步完成 - 这意味着您必须使用回调。

您的authenticator函数应该看起来像这样:

function authenticator(req, callback) {
    var mongoose = require('mongoose');
    var db = mongoose.createConnection('localhost','users');
    db.once('open', function() {
        var personschema = mongoose.Schema({
          username: String,
          password: String
        });

        var person1 = db.model('personcollection',personschema)
        person1.find({ username: req.body.username, password: req.body.password }, function(err, obj) {
            // in this callback you do what you want with this result!
            callback(obj.length === 0);
        });
    });
}

两个旁注:

  • 保持数据库连接分离怎么样?这样,您将在每个请求中打开它。
  • 您似乎将纯密码存储在数据库中,因为您将它们与请求中传递的密码进行比较:o 您应该真正在数据库中加密它们!
于 2013-08-13T17:26:55.283 回答
2

您正在尝试从异步函数返回一个值。句号。您对 node.js 和异步编程有一个基本的误解,您需要阅读教程并围绕异步代码以及为什么它们不能返回值而必须使用回调(或事件或承诺)来代替。

http://nodejsreactions.tumblr.com/post/56341420064/when-i-see-some-code-that-returns-a-value-from-an-async

于 2013-08-13T16:59:57.917 回答