从nodeia函数中的mariadb返回值

时间:2019-03-03 00:03:14

标签: node.js asynchronous mariadb

这是我的代码:

const mariadb = require('mariadb');
var test = async function(){
  var ret = "";
  await mariadb.createConnection({
        host: "localhost",
        user: "dave",
        connectionLimit: 5,
        password: "!@#",
        database: "db",
        rowsAsArray: false
  }).then((data)=>{
    ret = "test";
  });
  return ret;
}

console.log(test());

如何使用await从那以后获得回报?

我知道在很多情况下都提出过类似的问题,但是使用mariadb找不到任何问题。

1 个答案:

答案 0 :(得分:0)

我已经看到了一些陷阱,作为初学者,您将在此代码中遇到这些陷阱:

  • avait等待结果返回,因为他将得到Promisses来解决
  • then异步解决承诺
  • 定义为async的函数总是返回promise

过了一会儿高兴之后,“异步/等待”现在我试图避开他。主要是因为在使用then之前,我使用异步函数的每个函数也必须是异步的,例如进行小测试:

  let test = async function() {
    let x = await 11
    return 1;
  }
  console.log(test()) //returns: Promise { <pending> }

那里没有异步,但是添加async / await会造成混乱。

现在修复了您的代码

const mariadb = require('mariadb');
// use local scope `let` instead global `var`
let test = async function(){
  let conn = await mariadb.createConnection({
        host: "localhost",
        user: "dave",
        connectionLimit: 5,
        password: "!@#",
        database: "db",
        rowsAsArray: false
  });
  return conn.query("SELECT 1 as val") // no sense using `avait` because `test()` returns `promise`
}

test().then(function(rows) { console.log(rows)});

并且没有asnc。 then可以返回承诺,下一个then可以解决此问题


mariadb.createConnection(...).then(conn => { // create connection
    return conn.query("SELECT 1 as val") // make query
}).then(rows => { //get result
    console.log(rows)
}).catch(err => console.error(err)) // get errors

顺便说一句:对查询构建器感兴趣,例如knex.js。它允许编写独立于数据库引擎的代码。

更新

让我们从Node基于事件的事实开始。

让我们以从数据库接收数据为例。在PHP / C ++中,您进行查询,等待并接收结果。并且此行为由await模拟。 (等待出现在版本8附近)

通常,Node中的代码起作用,以便您执行查询,然后Node创建一个新线程。旧指令执行下一条指令,新指令将得到结果。 (好的,我在撒谎,但是更容易解释)。

因此,您必须处理接收数据的事件。更具体地说,promise是提供数据。通过await.then ()callback (hell)

第一个代码说明:

您尝试返回ret,但是此代码首先生成return ret,然后进行赋值。

await“返回”数据,因此您应该使用let var_name = await asyncFunction()

我想,你想要这个:

let getSomeDataFromDB = function(){
  return mariadb.createConnection([skip]).then(conn => {
    return conn.query("SELECT 1 as val") 
  })
}
let rows = await getSomeDataFromDB()

在此函数中,您将返回诺言,后者将诺言。通过await,这个承诺链得以解决。

但是这是代码中的“小”错误。因为您正在连接,并且您不会在任何地方终止连接。因此,最好有一个全局连接对象,或者使用类似这样的东西:


let getSomeDataFromDB = function(){
  return new Promise(function(resolve, reject){
    mariadb.createConnection([skip]).then(conn => {
      conn.query("SELECT 1 as val")
        .then(rows=>resolve(rows))
        .catch(e=>reject(e))
        .then(()=>conn.close())
    }).catch(e => reject(e))
  })
}
let rows = await getSomeDataFromDB()

在这里您发现另一件重要的事情:resolve不会中断代码的执行。尽管数据已返回给用户,您仍然可以做一些事情。

await

相同
let getSomeDataFromDB = async function(){
  let conn = await reateConnection([skip])
  let rows = await conn.query("SELECT 1 as val")
  await conn.close();
  return rows;
}
let rows = await getSomeDataFromDB()