我想使用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中的行数据返回/生成我的races变量的方法。我记录它,它显示正确的数据,但当我尝试将其传回时,它总是返回undefined。我在回调中尝试了几种方法,但我似乎无法弄清楚:
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"
答案 0 :(得分:1)
races
是一个数组,因为thunkify
用于query
。 co为任何使用多个值调用其回调的thun返回一个数组(即。callback(null, 1, 2, 3)
返回[1, 2, 3]
。
如果您要进行Promisify query
,races
将仅被分配给第一个返回值,这似乎与您正在寻找的内容一致。
以下是在实践中展示它的代码示例:
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
的值为1
,y
的值为数组[1, 2, 3]
。
您可以在此处使用Tonic运行它:https://tonicdev.com/56ab7cfc879afb0c002c1d49/56ab7cfc879afb0c002c1d4a