4

次のような私のnode.jsコード:

var data = "";
//redis client
client.get(key,function(err,value){
    data += value;
});
//output
console.log(data);

しかし、それは何も印刷しません。なんでそうなの?どうすればコールバック関数からデータを取得できますか?

どうもありがとう。

4

4 に答える 4

3

CALLBACK 外の Redis DATA のドキュメントからの回答

        const redis = require('redis');
        const redisClient = redis.createClient(process.env.REDIS_URI);

        // using Node.js >= v8 built-in utility
        const { promisify } = require('util');

        // forcing function to return promise
        const getAsync = promisify(redisClient.get).bind(redisClient);
        const value = await getAsync(key);

        console.log('value of redis key outside the callback is', value);
       

私はこれがその単純さのために少なくとも1つの投票に値すると思います:)

于 2020-08-10T23:09:09.797 に答える
2

後で(データがネットワーク経由で返されたときに)呼び出されるコールバックをredisクライアントに渡しますが、redis呼び出しを行った直後に、redisが値を送信する前に値を出力しようとしています。redis が値を返すまで待つ必要があります。

これを試して

var data = "";
//redis client
client.get(key,function(err,value){
    data += value;
    //output 
    console.log(data);
});
于 2013-03-31T09:19:45.617 に答える
0

役立つ場合に備えて、コールバックをプロミスに変換する Redis ファイルを貼り付けます。タイプスクリプトとタイプセーフです。インテリセンスとオートコンプリートを受け取るはずです。

import redis from "redis"
import { promisify } from "util"
import { redisHost as host, redisPort as port } from "../../configKeys"

const client = redis.createClient({
  port,
  host,
})

client.on("connect", () => {
  console.log(`Redis Client connected on port ${port}`)
})

client.on("ready", () => {
  console.log("Redis Client ready to use..")
})

client.on("error", (err) => {
  console.log(err.message)
})

client.on("end", () => {
  logCommon.debug("Redis Client disconnected")
})

process.on("SIGINT", () => {
  client.quit()
})

export const GET_ASYNC = (promisify<string>(client.GET).bind(
  client
) as unknown) as (key: string) => Promise<string | null>

export const SET_ASYNC = (promisify<string, string, string, number>(
  client.SET
).bind(client) as unknown) as (
  key: string,
  value: string,
  mode: string,
  duration: number
) => Promise<"OK" | null>

export const DELETE_ASYNC = (promisify<string>(client.DEL).bind(
  client
) as unknown) as (key: string) => Promise<number | null>

export default client

必要なファイルにインポートGET_ASYNCまたはインポートSET_ASYNCすると、約束のように async-await で使用できます。

于 2021-06-15T06:59:55.213 に答える
-1

redis バインディングのclient.get機能は非同期です。

redis サーバーへのクエリが完了した後、コールバック関数を呼び出します。コールバックで出力を出力する必要があります。

var data = "";
//redis client
client.get(key,function(err,value){
    data += value;
    //output
    console.log(data);
});
于 2013-03-31T09:23:22.803 に答える