NodeJs接收回调对象
NodeJs receiving callback object
我正在为我的应用程序开发身份验证模块。每当用户名和密码被发布到'/admin/login' Api时,它会调用Auth控制器的登录函数。此外,我使用猫鼬模型从MongoDb查询,并将找到的对象返回到一个变量。
auth.controller.js
var jwt = require('jwt-simple');
var bcrypt = require('bcrypt');
var User = require('../models/user.model.js');
var secret = require('../config.js').jwt_secret;
var auth = {
login : function (req, res) {
var username = req.body.username;
var password = req.body.password;
if (username === '' || password === '') {
res.status(401).json({message : 'Invalid Credentials'});
return;
}
var dbUserObj = auth.validate(username, password); // receives the User object returned from callback
console.log(dbUserObj); //displays 'undefined'
if (!dbUserObj) {
res.status(401).json({message : 'Invalid Username or Password'});
return;
}
if (dbUserObj) {
console.log('user found');
res.json(genToken(dbUserObj));
}
},
validate : function (user, pass) {
User.findOne({username : user}, function (err, user) {
if (err) {
return;
}
if (user==null) {
console.log('no user found');
return;
} else {
bcrypt.compare(pass, user.password, function (err,result) {
if (result == true) {
return user;
}
});
}
});
}
}
function genToken (user) {
var expires = expiresIn(7);
var token = jwt.encode({exp : expires},secret);
return {
token : token,
exp : expires,
user: user
}
}
function expiresIn (t) {
var dateObj = new Date();
return dateObj.setDate(dateObj.getDate() + numDays);
}
module.exports = auth;
dbUserobject变量接收由验证函数返回的User对象。但如果我记录这个变量它显示的是"未定义"我知道有回调问题,下一行代码运行,回调后返回对象dbUserObject变量被初始化,它总是发送响应"无效的用户名或密码",因为dbUserObject变得未定义。我试了好几种方法,但都没有解决。
我如何使其工作,就像它首先接收DbUserObj,然后决定是否发送无效响应或生成Json Web令牌。
谢谢,
由于存在Sync和Async函数的问题,因为您的auth.validate
表现为异步而不是等待结果,因为哪个用户对象未定义,您可以通过使用Promise
来解决这个问题。
var auth = {
login : function (req, res) {
var username = req.body.username;
var password = req.body.password;
if (username === '' || password === '') {
res.status(401).json({message : 'Invalid Credentials'});
return;
}
auth.validate(username, password)
.then(function(dbUserObj) { // `validate` returns a promise
console.log(dbUserObj); // Log the value once it is resolved
if (!dbUserObj) {
res.status(401).json({message : 'Invalid Username or Password'});
return;
}
if (dbUserObj) {
console.log('user found');
res.json(genToken(dbUserObj));
}
console.log(dbUserObj); //displays 'undefined'
}).catch(function(v) {
// Or do something else if it is rejected
// (it would not happen in this example, since `reject` is not called).
});
},
validate : function (user, pass) {
return new Promise(function(resolve, reject) {
User.findOne({username : user}, function (err, user) {
if (err) {
return;
}
if (user==null) {
console.log('no user found');
return;
} else {
bcrypt.compare(pass, user.password, function (err,result) {
if (result == true) {
return user;
}
});
}
});
// Only `delay` is able to resolve or reject the promise
setTimeout(function() {
resolve(user); // After 3 seconds, resolve the promise with user
}, 3000);
});
}
}
相关文章:
- 将对象传递给原型回调
- 从回调内部填充对象
- Javascript:对回调创建的对象执行方法
- Javascript-如何从字符串/对象引用回调
- Javascript使用本地存储,回调对象并用Json更改为一个字符串以用于填充函数
- 如何将状态对象/数据传递给(异步)ajax 回调
- Angular promise回调不是在构造函数方法内部触发,而是在对象文本方法中触发
- 作用域,在回调中丢失对对象的引用
- NodeJS fs.readdr-将回调内部作为对象返回
- 在对象内完成ajax调用后触发Javascript回调
- 使用回调处理程序调用函数内部的父对象方法
- 从嵌套在函数中的Node.js回调返回对象
- 带有回调的Javascript对象方法中的递归
- 当查询返回对象时,Express Mongo回调返回undefined
- 如何在回调函数中为正确的对象添加值
- Javascript:如何在回调中设置父对象变量
- jquery延迟对象回调未触发
- Javascript在对象回调中设置对象属性
- 从新对象回调返回值
- 使用& # 39;这个# 39;和一个JQuery函数在对象回调