web-dev-qa-db-ja.com

ノード8 util.promisifyでnode-redisを使用します

node -v:8.1.2

私はredisクライアント node_redis をノード8 util.promisifyで使用します。

コールバックredis.getは問題ありませんが、タイプ取得エラーメッセージを約束します

TypeError:未定義のプロパティ 'internal_send_command'を読み取れません
get(D:\ Github\redis-test\node_modules\redis\lib\commands.js:62:24)
get(internal/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)
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();
})()
24
wi Yu

let get = util.promisify(client.get);の変更

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

私のためにそれを解決しました:)

50
Jannic Beck

ノードv8以降を使用している場合、次のようにutil.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'
});

またはasync awaitを使用:

async myFunc() {
    const res = await getAsync('foo');
    console.log(res);
}

redis official repo から恥知らずにされた

1
Edwin Ikechukwu