从节点中的thunk获取数据,mysql,koa

Getting data from thunk in node, mysql, koa

我想使用 Koa 和 mysql 节点包从我的 MySQL 数据库中获取一些数据。我正在查看 co-mysql,但自述文件建议直接使用 thunkify。所以我做了以下事情:

const query = thunkify(connection.query.bind(connection));

这似乎有效,因为我现在可以做到:

app.use(function * main() {
  const races = yield query(
    "SELECT * FROM `races` where '2016-01-19' between start_date and end_date"
  )(function(err, rows) {
    // rows is the data I need
  });
});

但是,我无法找到将 thunk 中的行数据 return/yield 放入我的 races 变量的方法。我记录了它,它显示了正确的数据,但是当我尝试将它传回时,它总是 returns 未定义。我已经从回调内部尝试了几种方法,但我似乎无法弄清楚:

return rows yield rows(使回调成为生成器函数) return yield rows ...

我经常收到:TypeError: You may only yield a function, promise, generator, array, or object, but the following object was passed: "undefined"

races 是一个数组,因为您将 thunkify 用于 query。 co returns 一个数组,用于任何使用多个值调用其回调的 thunk(即 callback(null, 1, 2, 3) returns [1, 2, 3]

如果您改为 Promisify queryraces 将仅分配给第一个返回值,这似乎与您要查找的内容一致。

这是一个代码示例,在实践中展示了它:

var co = require("co")
var promisify = require("bluebird").promisify
var thunkify = require("thunkify")

function async(callback) {
    callback(null, 1, 2, 3)
}

var p = promisify(async)
var t = thunkify(async)

co(function*() {
    let x = yield p()
    let y = yield t()
    console.log(x)
    console.log(y)
}).then(() => {})

当运行时,x的值为1y的值为数组[1, 2, 3].

你可以 运行 在这里用 Tonic: https://tonicdev.com/56ab7cfc879afb0c002c1d49/56ab7cfc879afb0c002c1d4a