将node-redis与节点8 util.promisify一起使用

wi *_* Yu 26 redis node.js promise

node -v:8.1.2

我使用redis客户端node_redis和节点8 util.promisify,没有blurbird.

回调redis.get没问题,但是promisify类型获取错误消息

类型错误:无法读取的未定义的属性'internal_send_command'
那啥(d:\ Github上\ redis的测试\node_modules\redis的\ LIB\commands.js:62:24)
在GET(内部/ util.js中:229:26)
在对象中的D:\ Github\redis-test\app.js:23:27
.(D:\ Github\redis-test\app.js:31:3)
在Module._compile(module.js:569:30)
的Object.Module._extensions..js(module.js:580:10)
at at Module.load(module.js:503:32)
在tryModuleLoad(module.js:466:12)
的Function.Module._load(module.js:458:3)
位于Function.Module.runMain(module.js:605) :10)

我的测试代码

const util = require('util');

var redis = require("redis"),
    client = redis.createClient({
        host: "192.168.99.100",
        port: 32768,
    });

let get = util.promisify(client.get);

(async function () {
    client.set(["aaa", JSON.stringify({
        A: 'a',
        B: 'b',
        C: "C"
    })]);

    client.get("aaa", (err, value) => {
        console.log(`use callback: ${value}`);
    });

    try {
        let value = await get("aaa");
        console.log(`use promisify: ${value}`);
    } catch (e) {
        console.log(`promisify error:`);
        console.log(e);
    }

    client.quit();
})()
Run Code Online (Sandbox Code Playgroud)

Jan*_*eck 56

改变 let get = util.promisify(client.get);

let get = util.promisify(client.get).bind(client);

为我解决了:)

  • 谢谢!它解决了,就是没有绑定的this问题[this.internal_send_command](https://github.com/NodeRedis/node_redis/blob/ff9b727609ea125919828f7373e40082fd432eec/lib/commands.js#L62)未定义 (2认同)

Edw*_*kwu 5

如果您使用的是 node v8 或更高版本,您可以使用 util.promisify promisify node_redis,如下所示:

const {promisify} = require('util');
const getAsync = promisify(client.get).bind(client); // now getAsync is a promisified version of client.get:

// We expect a value 'foo': 'bar' to be present
// So instead of writing client.get('foo', cb); you have to write:
return getAsync('foo').then(function(res) {
    console.log(res); // => 'bar'
});
Run Code Online (Sandbox Code Playgroud)

或使用异步等待:

async myFunc() {
    const res = await getAsync('foo');
    console.log(res);
}
Run Code Online (Sandbox Code Playgroud)

无耻地从redis 官方 repo中剔除