我在快递中编写后端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
当我把它放在快速路线中时,它本身就起作用了,但是我希望保持路线漂亮,尽可能少的代码。这是一个选择吗?
感谢您的帮助。
答案 0 :(得分: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);
});
});
}
两个旁注:
答案 1 :(得分:2)
您正尝试从异步函数返回值。完全停止。你对node.js和异步编程有一个基本的误解,你需要阅读教程并围绕异步代码,以及为什么它们不能返回值,而必须使用回调(或事件或承诺)。