我一直在尝试使用Express Web服务器开发在Electron上运行的应用程序。我还使用 mysql npm软件包存储数据库内容。但是登录功能有问题,我找不到问题。希望您能提供帮助。
server.js
function userLogin(data){
con.query(`SELECT * FROM players WHERE player_username = '${data.login_username}'`, (err, result, fields) => {
if (err) throw err;
var compare = bcrypt.compareSync(data.login_password, result[0].player_password);
if(compare == true) {
return "1";
}
else{
return "0";
};
});
};
app.route('/login').post((req,res) => {
res
.json(userLogin(req.body))
.end();
});
一切都定义好了。没有显示错误,但函数无法返回,我不明白为什么。如果我在console.log
上方添加return
,它将记录结果,因此查询也可以,但是该函数不会返回任何东西,实际上是任何东西。
答案 0 :(得分:1)
由于userLogin
是一个异步函数,因此不能像普通函数一样调用它并期望它返回值。相反,您应该在con.query
的回调可用时处理其结果,如下所示:
app.route('/login').post((req, res) => {
con.query(`SELECT * FROM players WHERE player_username = '${data.login_username}'`, (err, result, fields) => {
var compare = bcrypt.compareSync(data.login_password, result[0].player_password);
res.json(compare ? "1" : "0").end();
});
});
答案 1 :(得分:0)
在发送响应之前,您必须等待查询完成。一种方法是将其转换为Promise,另一种方法是使用回调
function userLogin(data, onComplete){
con.query(`SELECT * FROM players WHERE player_username = '${data.login_username}'`, (err, result, fields) => {
if (err) throw err;
var compare = bcrypt.compareSync(data.login_password, result[0].player_password);
if(compare == true) {
onComplete("1"); // do callback function
}
else{
onComplete("0");
};
});
};
app.route('/login').post((req,res) => {
userLogin(req.body, (val) => {res.json(val).end(); } ) // pass the function as callback
});