Node.js Подождите, пока Redis client.get перед отправкой объекта JSON - PullRequest
0 голосов
/ 14 сентября 2018

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

1 Ответ

0 голосов
/ 14 сентября 2018

Ну, вызовы 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, но это хорошая отправная точка.

Надеюсь, это поможет

...