Асинхронная функция в узле.JS, вызывающий SQL Server, не работает должным образом

#node.js

Вопрос:

У меня есть функция, которую я вызываю для входа в систему пользователя, следующим образом:

 async function loginUser(username, password) {
  let msg = {
    success: 0,
    message: '',
  };
  sql.connect(process.env.DB_CONNSTRING, function (err) {
    if (err) {
      res.json(err);
      return;
      msg.success = '0';
      msg.message = 'ERR_04: Could not connect to server.';
      return msg;
    }

    let sqlString = ` SELECT        userid
         FROM            dbo.users
         WHERE        (email = @username) AND (password = @password)`;
    request = new sql.Request();
    request.input('username', sql.NVarChar, username);
    request.input('password', sql.NVarChar, password);
    request.query(sqlString, function (err, results) {
      if (err) {
        msg.success = '0';
        msg.message = 'ERR_011: Could not connect to server.';
        return msg;
      }
      if (results.rowsAffected[0] != 0) {
        console.log(results.recordset[0]);
        return results.recordset[0];
      } else {
        msg.success = '0';
        msg.message = 'Invalid username and password combination.';
        return msg;
      }
    });
  });
}
 

Пожалуйста, обратите внимание на консоль.регистрируйте, если запрос возвращает результаты.

Я вызываю эту функцию следующим образом:

 await loginUser(username, encryptedPassword)
  .then((result) => {
    console.log(result);
  })
  .catch((err) => {
    msg.message = 'API Error.';
    res.json(msg);
  });
 

Где у меня также есть console.log()

Проблема в том, что консоль.журнал для вызова приходит как неопределенный, но тот, который находится внутри функции, выдает данные.

Я не знаю, чего мне здесь не хватает, поэтому буду признателен за любую помощь.

Спасибо.

Ответ №1:

Если вам не нужно вызывать функцию, вы можете попробовать это.

     let sqlString = ` SELECT  userid  FROM dbo.users  WHERE (email ='${username}') AND (password = '${password}')`;
    let conn = await sql.connect(process.env.DB_CONNSTRING)
    let recordset = await conn.query(sqlString)
    res.json(recordset)
 

Комментарии:

1. Это сработало очень хорошо. Большое спасибо.

Ответ №2:

В JS, если функция не имеет явного возврата, она возвращает неопределенное значение.

Итак, у вас есть функция async function loginUser : async здесь указывает, что ваша функция может выполняться асинхронно(как обещано), но она не возвращает никаких значений;

Таким образом, вместо того, чтобы отмечать вашу функцию как асинхронную, вам нужно обещать свои обратные вызовы и возвращать обещание;

Это может быть что — то вроде:

 const { promisify } = require('util');

async function loginUser(username, password) {
 let msg = {
   success: 0,
   message: '',
 };
 await promisify(sql.connect(process.env.DB_CONNSTRING));
 let sqlString = `SELECT  userid
 FROM dbo.users
 WHERE (email = @username) AND (password = @password)`;
 request = new sql.Request();
 request.input('username', sql.NVarChar, username);
 request.input('password', sql.NVarChar, password);
 return await promisify(request.query(sqlString));
}
 

Обратите особое внимание на обработку ошибок, а также на то, где вы хотите(нуждаетесь) ожидать вызова, а где нет;

Комментарии:

1. Спасибо, Алекс! Я пытаюсь найти ваше решение, но получаю ошибку типа ERR_INVALID_ARG_TYPE, которую я раньше не получал. Я попробую найти обходной путь и дам вам знать. Спасибо!