在节点中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函数中使用承诺是一个很好的红旗,你做错了什么。