#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, которую я раньше не получал. Я попробую найти обходной путь и дам вам знать. Спасибо!