Node.js Async.js结合node-mysql使用的疑问

发布于 2022-09-02 01:31:35 字数 1538 浏览 18 评论 0

使用Async.js查询三条SQL语句并返回结果:

var sqls = {
  table_a: "select count(*) from table_a",
  table_b: "select count(*) from table_b",
  table_c: "select count(*) from table_c"
};

async.map(sqls, function(item, callback) {
  connection.query(item, function(err, results) {
    callback(err, results);
  });
}, function(err, results) {
  if(err) {
    console.log(err);
  } else {
    console.log(results);
  }
});

可以输出:

{ table_a: [ { 'count(*)': 26 } ],
  table_b: [ { 'count(*)': 3 } ],
  table_c: [ { 'count(*)': 2 } ] }

根据map函数的文档:

arr - An array to iterate over.
iterator(item, callback) - A function to apply to each item in arr. The iterator is passed a callback(err, transformed) which must be called once it has completed with an error (which can be null) and a transformed item.
callback(err, results) - Optional A callback which is called when all iterator functions have finished, or an error occurs. Results is an array of the transformed items from the arr.

connection.query函数符合第二个参数iterator(item, callback)。

为什么以下的使用方式会报错:

var sqls = {
  table_a: "select count(*) from table_a",
  table_b: "select count(*) from table_b",
  table_c: "select count(*) from table_c"
};

async.map(sqls, connection.query, function(err, results) {
  if(err) {
    console.log(err);
  } else {
    console.log(results);
  }
});
TypeError: Cannot read property 'typeCast' of undefined

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不醒的梦 2022-09-09 01:31:35

正确代码如下:

async.map(sqls, connection.query.bind, function(err, results) {
  if(err) {
    console.log(err);
  } else {
    console.log(results);
  }
});

原因是connection.query运行中的 this 并不是指向 connection, 所以会导致错误,官方对此有解释https://github.com/caolan/async#binding-a-context-to-an-iterator

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文