1

私はエクスプレスでバックエンドの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

関数自体はエクスプレス ルート内に配置すると機能しますが、できるだけ少ないコードでルートをきれいに保ちたいと考えています。それはオプションですか?

ご協力いただきありがとうございます。

4

2 に答える 2

3

JavaScript のすばらしい非同期の世界へようこそ :)
そしてさらに、Node.js の世界へ。

これは、ノード内のネットワーキングを同期的に行うことができないために発生します。これは、コールバックを使用する必要があることを意味します。

関数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);
        });
    });
}

2 つの補足事項:

  • DB接続を分離したままにするとどうなりますか? このようにして、リクエストごとに開くことができます。
  • リクエストで渡されたものとそれらを比較しているため、プレーンパスワードをDBに保存しているようです:o DBでそれらを本当に暗号化する必要があります!
于 2013-08-13T17:26:55.283 に答える