Search code examples
jsonnode.jsredisgetwait

Node.js Wait for redis client.get before send json object


res.json(data) is called before redis client get data from server... How can i wait for data before send json object?

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

Solution

  • Well, redis calls are async. That means that every query call must receive a callback function that shall be called once the query completes injecting data an errors. In order to send res.json when all data is ready then you must do something like:

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

    I'd recommend working with await and Promises however, but this is a good starting point.

    Hope this helps