繁体   English   中英

异步/等待 nodejs mysql 函数

[英]Async/Await nodejs mysql function

我在使用 nodejs 时遇到问题,实际上,正如您从我通过 google drive 链接输入的两个模块所看到的,我的登录表单有问题,因为尽管我在两个函数调用中都输入了 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;

您可以在返回承诺的函数上使用 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 块来处理错误:

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

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 });
    });
})

路由处理程序中使用的 IIFE 是不必要的......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM