首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Async/Await nodejs mysql函数

Async/Await nodejs mysql函数
EN

Stack Overflow用户
提问于 2019-12-06 04:05:52
回答 2查看 340关注 0票数 0

我有一个nodejs的问题,在实践中,你可以从我通过google驱动器链接输入的两个模块中看到,我有一个登录表单的问题,因为虽然我在两个函数调用中都输入了asyn / await,但它不等待,但无论如何它都会继续,实际上它会将返回变量打印为“未定义”。提前感谢每一个回答的人!

Router.js:

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

发布于 2019-12-06 04:24:05

您可以在返回promise的函数上使用await。

更改login.js,如下所示:

代码语言:javascript
复制
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文档中的示例代码:

代码语言:javascript
复制
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块来处理错误:

代码语言:javascript
复制
try {
      const [rows, fields] = await connection.execute('SELECT * FROM `table` 
  WHERE `name` = ? AND `age` > ?', ['Morty', 14]);
}
catch(err) {
 handle error here
}
票数 1
EN

Stack Overflow用户

发布于 2019-12-06 04:28:14

从您的login.js流程来看,您似乎必须提供一个回调函数才能从中获得结果。

login.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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 });
    });
})

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59202546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档