首页 新闻 会员 周边

关于nodejs的connection.query()方法异步特性问题

0
悬赏园豆:50 [待解决问题]
        最近在开发一个微信小程序,采用nodejs后台,在一个读取MySQL数据库并返回数据给前端的场景上遇到了问题,描述如下,忘各位高手相助。        先看代码:
        
[JavaScript] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module.exports = ctx=>{
  var mysql = require('mysql');
  var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'wxb7e2f16d9e113148',
    database: 'yhytest'
  });
  connection.connect();
  var a='ini';
  var sql = 'SELECT * FROM yhytesttable';
  //查
  connection.query(sql, function (err, result) {
    if (err) {
      a = err.message;
      return;
    }
    a = result["0"].name;
  });
  ctx.state.data = {
    msg: a
  }
}
因为connection.query()是异步的,所以不等它返回结果,ctx.state.data就会先一步执行,从而无法获取从数据库查询回来的数据。而如果我把ctx.state.data的赋值写在connection.query()的响应函数里面,ctx.state.data可以被正确赋值,但返回到前端又显示data是空的。不知道是什么原因,希望各位可以提供思路,感激不尽~
__sai的主页 __sai | 初学一级 | 园豆:116
提问于:2018-04-26 23:38
< >
分享
所有回答(2)
0

在回调函数中,响应请求。

还可以考虑用await:https://github.com/hstarorg/code-pusher/blob/master/packages/push-server/src/bizs/accessKeysBiz.js 

幻天芒 | 园豆:37175 (高人七级) | 2018-04-27 10:58
module.exports = ctx=>{
  ...
  connection.query(sql, function (err, result) {
    if (err) {
      a = err.message;
      return;
    }
    a = result["0"].name;
    ctx.state.data = {
    msg: a
  }
  });
}
这样写的话,data传到前端又显示没值
支持(0) 反对(0) __sai | 园豆:116 (初学一级) | 2018-04-27 11:02

@__sai: 怎么会呢~你需要理解下Promise的玩法,以及koa的管道模型。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2018-04-27 17:23
0

用promise吧,你可以百度学习一下。

promise的机制可以实现当一个异步代码完成以后,由你去通知它成功完成了,再进行下一步操作。

new Promise(resolve,reject){

connection.query(sql,function (err, result) {
    if (err) {
      a = err.message;
      return;
    }
    a = result["0"].name;
  });
resolve();

}.then(

ctx.state.data = {
    msg: a
  }

)

你风致 | 园豆:2213 (老鸟四级) | 2018-08-01 11:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册