【问题标题】:Node.js Wait for redis client.get before send json objectNode.js 在发送 json 对象之前等待 redis client.get
【发布时间】:2019-02-19 07:22:49
【问题描述】:

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);
});

【问题讨论】:

    标签: json node.js redis get wait


    【解决方案1】:

    嗯,redis 调用是异步的。这意味着每个查询调用都必须接收一个回调函数,一旦查询完成注入数据和错误,该回调函数就会被调用。为了在所有数据准备就绪时发送 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,但这是一个很好的起点。

    希望对你有帮助

    【讨论】:

    • 好的,这个工作!你能告诉我如何使用 async/await 和 Promises 做到这一点吗?
    • 好的。您能否将答案标记为正确? (点击绿色的“勾号”)
    • 你去。我已经改变了我的答案,以展示如何使用 Promise 和 vanilla javascript 来解决它。更优雅的解决方案是使用带有 lambda 的 ECMASCRIPT6。但不知道大家是否熟悉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2011-02-10
    相关资源
    最近更新 更多