ExpressJS函数无法返回

时间:2019-10-09 16:53:18

标签: javascript node.js express

我一直在尝试使用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,它将记录结果,因此查询也可以,但是该函数不会返回任何东西,实际上是任何东西。

2 个答案:

答案 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
});