javascript - Nodejs mysql 异步/等待函数

标签 javascript mysql node.js express

我在使用nodejs时遇到了问题,实际上,正如您从我通过谷歌驱动器链接输入的两个模块中看到的那样,我在登录表单方面遇到了问题,因为尽管我在两个函数中都输入了asyn/await,但它们都调用了它不会等待,但无论如何都会继续,事实上它将返回变量打印为“未定义”。预先感谢所有回答的人!

路由器.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});
 })();
})

登录.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;

最佳答案

您可以在返回 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 内置了对 Promise 的支持。我建议使用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 block 来处理错误:

try {
      const [rows, fields] = await connection.execute('SELECT * FROM `table` 
  WHERE `name` = ? AND `age` > ?', ['Morty', 14]);
}
catch(err) {
 handle error here
}

关于javascript - Nodejs mysql 异步/等待函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59202546/

相关文章:

javascript - 在 Backbone Marionette 2.4.4 中将下划线 1.8.3 换成 lodash 4.2.1

javascript - Twilio 测试短信没有结果 StatusCallback

php - 如何将多个选定的 MySQL 列插入到单个 PHP 数组

node.js - 使用 shell 选项将 bash 与 Node.js child_process 一起使用失败

node.js - NodeJS 模块安装程序未设置 PATH 变量

javascript - 当 centerMode 为 true 且 infinite 为 false 时,Slick.js 删除第一张和最后一张幻灯片上的间隙

javascript - 对同一选择器执行一个又一个操作(jquery)

mysql - 如何避免mysql存储过程中的IN(Select...)子查询

mysql - 从刚插入的行中检索数据(MySql 和 Node.js)

node.js - 发布到nodejs并返回结果