在节点中validation用户时获取奇怪的输出

我创build了一个抓取用户email & password的函数,然后在数据库中运行一些检查来查看细节是否有效。 如果细节是有效的,那么用户将被parsing回API密钥。

但由于某种原因,一些函数被调用之前其他人,我得到undefined的variables,这是假设是返回userObj

在这个函数中,我添加了控制台日志0,1,2,4和5,所以当我调用函数时,你可以看到奇怪的输出。 我将在下面包含我的代码和控制台输出! 我使用sequalize模型,我知道他们正在返回正确的数据,因为我已经testing了它。 我也在使用promises

码:

 var auth = { login: function(req, res) { var email = req.body.email || ''; var password = req.body.password || ''; // If nothing parsed, return json obj if (email == '' || password == '') { console.log("1"); res.status(401); res.json({ "status": 401, "message": "Invalid credentials" }); return; } // Fire a query to your DB and check if the credentials are valid var dbUserObj = auth.validateUser(email, password); console.log("0 _____"); console.log(dbUserObj); // I am returning undefined??? Why the! if (!dbUserObj) { // If authentication fails, we send a 401 back res.status(401); res.json({ "status": 401, "message": "Invalid credentials" }); return; } console.log("1 ____"); authToken.create({ userId: dbUserObj.userId, token: genToken(dbUserObj)}).then(function(results){ res.json("token", results.token); }); console.log("2 ____"); }, validateUser: function(email, password) { // console.log(email + " pass: " + password); console.log("3 ____"); user.findAll({ where: { email : email, password : password }, raw: true }).then(function(results) { console.log("4 _____"); console.log(results); return results; // results prints out with all the correct values!!!!!!!!!! }).catch(function (err) { return err; console.log(err); }); console.log("5 _____"); }, 

控制台输出:

你可以看到我在dbUserObj对象上没有定义,但是我真的不知道为什么,因为我打印出结果BEFORE我正在返回它们(如下图所示)。

 3 ____ 5 _____ 0 _____ undefined POST /login/ 401 1.341 ms - 46 Executing (default): SELECT `userId`, `name`, `password`, `email`, `authKey`, `profilePic`, `coverPic`, `description`, `createdAt`, `updatedAt` FROM `user` AS `user` WHERE `user`.`email` = 'jameswain10@gmail.com' AND `user`.`password` = 'f6588fc86e19db0936d9b7e8fd3d6c6544af6cdcc3ce161da88adcdb4b952adb'; 4 _____ RESULTS ARE BELOW ---- [ { userId: 1, name: 'James', password: 'f6588fc86e19db0936d9b7e8fd3d6c6544af6cdcc3ce161da88adcdb4b952adb', email: 'james@gmail.com', authKey: '$$$Ddjjdafjjadsfjadsjfjadfsj2', profilePic: 'default.png', coverPic: 'default.png', description: 'This user doesn\'t have a description!', createdAt: Wed Dec 23 2015 12:48:35 GMT+1100 (AEDT), updatedAt: Wed Dec 23 2015 12:48:35 GMT+1100 (AEDT) } ] 

正如你可以在上面的console output看到的,一些日志应该是在它们之前和之后注销的? 有谁知道这是为什么发生!?

您遇到与Async有关的问题。

validation用户还原的承诺:

 validateUser: function(email, password) { // console.log(email + " pass: " + password); console.log("3 ____"); return user.findAll({ where: { email : email, password : password }, raw: true }); 

在你的loginfunction中,你可以再用那个函数的结果。

 login: function(req, res) { var email = req.body.email || ''; var password = req.body.password || ''; // If nothing parsed, return json obj if (email == '' || password == '') { console.log("1"); res.status(401); res.json({ "status": 401, "message": "Invalid credentials" }); return; } // Fire a query to your DB and check if the credentials are valid auth.validateUser(email, password) .catch(function() { //.. handle error } .then(function(results) { var dbUserObj = results; console.log("0 _____"); console.log(dbUserObj); // I am returning undefined??? Why the! if (!dbUserObj) { // If authentication fails, we send a 401 back res.status(401); res.json({ "status": 401, "message": "Invalid credentials" }); return; } console.log("1 ____"); authToken.create({ userId: dbUserObj.userId, token: genToken(dbUserObj)}).then(function(results){ res.json("token", results.token); }); console.log("2 ____"); } }, 

奖励答案:

你得到undefined,因为这行:

 then(function(results) { console.log("4 _____"); console.log(results); return results; // results prints out with all the correct values!!!!!!!!!! 

这是将结果返回到“then”函数,该函数正在创build与dbobject一起解决的另一个承诺,但是之后您没有将其返回到顶层函数。 在不返回承诺或调用callback函数中使用承诺是一个很好的红旗,你做错了什么。