不能 return 数据从 nodejs 中的 bcrypt.compare() 函数中获取
Can't return data out of the bcrypt.compare() function in nodejs with promises
我目前正在使用 nodejs (10.15.2) 构建一个应用程序,但我 运行 遇到登录功能的一些问题。
我的 "dbconnector.js" 文件中的片段:
login(email, password) {
return userModel.findOne({
email: email
}).lean().then(function(user) {
// return user;
return bcrypt.compare(password, user.password, function(err, res) {
if (res) {
console.log(user); //prints the userinfo - works fine
return user;
}
});
});
};
我的 serve.js 文件中的片段:
app.post('/login', async (req, res) => {
var { email, password } = req.body;
var user = await dbconnector.login(email,password);
console.log(user) //returns undefined
if (user != false) {
console.log("loggedin");
const accessToken = jwt.sign({ email: user.email, id: user.id }, key.tokenKey);
res.json({
accessToken
});
} else {
res.send('Username or password incorrect');
}
});
我的问题是 login()-函数 returns 未定义。但是,当我将其更改为以下内容时,它可以完美运行(只是不检查密码...):
login(email, password) {
return userModel.findOne({
email: email
}).lean().then(function(user) {
return user;
});
};
所以我知道 bcrypt / promise 部分有问题,但我找不到解决方案。
我的兄弟,问题在于一个 promise 只会 return 你另一个 promise 和你在那里的比较回调,正如它的名字所说的回调不是一个 promise。让我们承诺一下
login(email, password) {
return userModel.findOne({
email: email
}).lean().then(function(user) {
// return user;
return new Promise((resolve, reject) => {
return bcrypt.compare(password, user.password, (err, res) => {
if (err) {
return reject(err);
}
return resolve(res);
})
};
但是!!!如果无论如何你使用的 bcrypt 包是这个
https://www.npmjs.com/package/bcrypt
那么你不必承诺该方法,它已经作为承诺
login(email, password) {
return userModel.findOne({
email: email
}).lean().then(function(user) {
return bcrypt.compare(password, user.password);
}).then(isEquals => {
if (isEquals) {
return true
}
return false
}).catch(error => {
throw error;
})
};
我目前正在使用 nodejs (10.15.2) 构建一个应用程序,但我 运行 遇到登录功能的一些问题。
我的 "dbconnector.js" 文件中的片段:
login(email, password) {
return userModel.findOne({
email: email
}).lean().then(function(user) {
// return user;
return bcrypt.compare(password, user.password, function(err, res) {
if (res) {
console.log(user); //prints the userinfo - works fine
return user;
}
});
});
};
我的 serve.js 文件中的片段:
app.post('/login', async (req, res) => {
var { email, password } = req.body;
var user = await dbconnector.login(email,password);
console.log(user) //returns undefined
if (user != false) {
console.log("loggedin");
const accessToken = jwt.sign({ email: user.email, id: user.id }, key.tokenKey);
res.json({
accessToken
});
} else {
res.send('Username or password incorrect');
}
});
我的问题是 login()-函数 returns 未定义。但是,当我将其更改为以下内容时,它可以完美运行(只是不检查密码...):
login(email, password) {
return userModel.findOne({
email: email
}).lean().then(function(user) {
return user;
});
};
所以我知道 bcrypt / promise 部分有问题,但我找不到解决方案。
我的兄弟,问题在于一个 promise 只会 return 你另一个 promise 和你在那里的比较回调,正如它的名字所说的回调不是一个 promise。让我们承诺一下
login(email, password) {
return userModel.findOne({
email: email
}).lean().then(function(user) {
// return user;
return new Promise((resolve, reject) => {
return bcrypt.compare(password, user.password, (err, res) => {
if (err) {
return reject(err);
}
return resolve(res);
})
};
但是!!!如果无论如何你使用的 bcrypt 包是这个 https://www.npmjs.com/package/bcrypt 那么你不必承诺该方法,它已经作为承诺
login(email, password) {
return userModel.findOne({
email: email
}).lean().then(function(user) {
return bcrypt.compare(password, user.password);
}).then(isEquals => {
if (isEquals) {
return true
}
return false
}).catch(error => {
throw error;
})
};