我有一个nodejs的问题,在实践中,你可以从我通过google驱动器链接输入的两个模块中看到,我有一个登录表单的问题,因为虽然我在两个函数调用中都输入了asyn / await,但它不等待,但无论如何它都会继续,实际上它会将返回变量打印为“未定义”。提前感谢每一个回答的人!
Router.js:
router.post('/ajax/login', function(req, res, next) {
(async () => {
var loginDb = await login.login(req.body.matricola, req.body.password);
console.log(loginDb);
res.json({output: loginDb, matricola: req.body.matricola});
})();
})login.js
var response;
async function login(matricola, password){
var conn = connect();
await conn.connect(function(err){
if(!err){
//query ricerca utente nel db
password = md5(password); //cifro la password
conn.query("SELECT * FROM user WHERE matricola=? AND password=?",[matricola, password]
,function(err, result){
if(!err){
if(result.length == 1 && matricola == result[0].matricola && password == result[0].password){
//Invio segnale di logged-in al client
response = "logged-in";
}
else{
response = 'error-login';
}
}
})
}
else{
response = 'error-db';
}
})
return response;
}
exports.login = login;发布于 2019-12-06 04:24:05
您可以在返回promise的函数上使用await。
更改login.js,如下所示:
function login(matricola, password){
return new Promise(function(resolve,reject){
conn.connect(function(err){
if(!err){
//query ricerca utente nel db
password = md5(password); //cifro la password
conn.query("SELECT * FROM user WHERE matricola=? AND password=?",[matricola, password]
,function(err, result){
if(!err){
if(result.length == 1 && matricola == result[0].matricola && password == result[0].password){
//Invio segnale di logged-in al client
resolve("logged-in")
}
reject(err);
}
})
}
reject(err)
})
})
}Mysql2内置了对promises的支持。我推荐使用mysql2。
mysql2文档中的示例代码:
async function main() {
// get the client
const mysql = require('mysql2/promise');
// create the connection
const connection = await mysql.createConnection({host:'localhost', user: 'root', database: 'test'});
// query database
const [rows, fields] = await connection.execute('SELECT * FROM `table` WHERE `name` = ? AND `age` > ?', ['Morty', 14]);
}另外,使用try-catch块来处理错误:
try {
const [rows, fields] = await connection.execute('SELECT * FROM `table`
WHERE `name` = ? AND `age` > ?', ['Morty', 14]);
}
catch(err) {
handle error here
}发布于 2019-12-06 04:28:14
从您的login.js流程来看,您似乎必须提供一个回调函数才能从中获得结果。
login.js
function login (matricola, password, cb) {
const conn = connect();
conn.connect (function(err){
// If there's an error in setting up the connection to db, terminate immediately
if (err) return cb (new Error("DB connection error"));
const hashedPassword = md5 (password);
const query = "SELECT * FROM user WHERE matricola=? AND password=?";
conn.query (query, [matricola, hashedPassword], function (err, result) {
// If there's an error with the query, terminate immediately
if (err) return cb(new Error("Query error"));
// Matricola and passwords match, so return a positive response
if (result.length === 1 && matricola === result[0].matricola && hashedPassword === result[0].password)
return cb (null, result[0]);
return cb (new Error("User not found"));
});
});
}
exports.login = login然后在你的router.js中,你可以这样称呼它:router.js
router.post ('/ajax/login', function (req, res, next) {
login.login (req.body.matricola, req.body.password, function (err, result) {
if (err) return res.status(401).send("Invalid matricola/password");
res.json ({ output: result, matricola: req.body.matricola });
});
})路由处理程序中使用的生命是不必要的...
https://stackoverflow.com/questions/59202546
复制相似问题