json - Node.js 在发送 json 对象之前等待 redis client.get

标签 json node.js redis get wait

res.json(data) 在 redis 客户端从服务器获取数据之前调用...我如何在发送 json 对象之前等待数据?

app.get('/api/player/:name', function(req, res) {
    var name = req.params.name;

    var data = {
        "connected": 0,
        "health": 0,
        "armour": 0
    };

    readClient.get(name + '.connected', function(err, value) {
        data.connected = value;
    });

    readClient.get(name + '.health', function(err, value) {
        data.health = value;
    });

    readClient.get(name + '.armour', function(err, value) {
        data.armour = value;
        console.log(data);
    });

    console.log(data);

    res.json(data);
});

最佳答案

嗯,redis 调用是异步的。这意味着每个查询调用都必须接收一个回调函数,一旦查询完成注入(inject)数据和错误,该回调函数就会被调用。为了在所有数据准备就绪时发送 res.json,您必须执行以下操作:

app.get('/api/player/:name', function(req, res) {
    var name = req.params.name;

    var data = {
        "connected": 0,
        "health": 0,
        "armour": 0
    };

    var promises = [];

    promises.push( new Promise( function(resolve,reject) {
        readClient.get(name + '.connected', function(err, value) {
            if(err) { reject(err); }
            resolve(value);
        });
    } ) );

    promises.push( new Promise( function(resolve,reject) {
        readClient.get(name + '.health', function(err, value) {
            if(err) { reject(err); }
            resolve(value);
        });
    } ) );

    promises.push( new Promise( function(resolve,reject) {
        readClient.get(name + '.armour', function(err, value) {
            if(err) { reject(err); }
            resolve(value);
        });
    } ) );

    Promise.all(promises).then( function(values) {
        console.log(values);
        data.connected = values[0];
        data.health = values[1];
        data.armour = values[2];
        res.json(data);
    } ).catch(handleError);
});

function handleError(err) {
    res.status(501); 
    res.send({msg:err.message});
}

不过,我建议使用 await 和 Promises,但这是一个很好的起点。

希望对你有帮助

关于json - Node.js 在发送 json 对象之前等待 redis client.get,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52332659/

相关文章:

java - Spring 3.2 测试,com.jajway 不包含在依赖项中

javascript - 在app.js和html之间共享数据

objective-c - 如何在 Objective-C 中使用 Redis?

redis - 如何设置 Phoenix PubSub 订阅者回调

rust - 在 Rust 中处理泛型和非泛型类型的枚举返回

java - 如何忽略一个实体中的属性而不忽略另一个实体中的属性 - JSON

java - 配置单元/ElasticMapreduce : How bring JsonSerDe to ignore malformed JSON?

Java Jersey / jackson : return dynamic JSON properties

javascript - 在对象数组上切片对象的最高性能

javascript - 如何在 Electron renderer.js 文件中使用 Node.js 解析 JSON?