Функция ExpressJS не может вернуться - PullRequest
0 голосов
/ 09 октября 2019

Я пытался разработать приложение, работающее на Electron, с веб-сервером Express. Я также использую пакет 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 ]

1 голос
/ 09 октября 2019

Поскольку 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();
  });
});
0 голосов
/ 09 октября 2019

Вы должны дождаться завершения запроса, прежде чем отправлять ответ. Один из способов - преобразовать его в 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
});
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...