Как объединить ответы от двух звонков в один ответ? - PullRequest
0 голосов
/ 27 января 2020

Я получаю пустой ответ ({}), тогда как мой ожидаемый ответ имеет формат:

{
    locationResponse: "location foo",
    forecastResponse: "forecast bar"
}

В моем файле индекса у меня есть:

const {getCity} = require('./routes/city');
const {getForecasts} = require('./routes/forecast');

app.get('/forecasts', function (req, res) {
    var location = getCity(req, res);
    var forecast = getForecasts(req, res);

    //these are logged as undefined
    console.log("Inside index.js");
    console.log(location);
    console.log(forecast);
    res.send({locationResponse: location, forecastResponse: forecast});
});

Внутри Файл прогноза У меня есть следующее, и аналогичный файл находится в файле города:

module.exports = {
    getForecasts: (req, res) => {
       var result = //mySQL DB calls and processing
       console.log("Inside getForecasts");
       console.log(result); //actual result printed
       return "Forecast";
    }

ОБНОВЛЕНИЕ : Таким образом, я добавил несколько журналов непосредственно перед операторами возврата каждого вызова и выяснил, что журналы печатаются в следующем порядке, что означает, что он не работает должным образом, потому что я не учел тот факт, что они являются асинхронными вызовами.

Inside index.js
undefined
undefined
Inside getForecasts
{result}

Ответы [ 3 ]

1 голос
/ 27 января 2020

Кажется, что обе функции getCity () и getForecasts () имеют асин c. Эти асинхронные функции возвращают обещание, а не реальный ответ.

Таким образом, вы можете использовать простые asysn / await или Promise.all в JS для решения проблемы.

Вариант 1: используйте await для разрешения обещания перед записью сообщения на консоль:

app.get('/forecasts', async function (req, res) {
    var location = await getCity(req, res);
    var forecast = await getForecasts(req, res);

    //these are logged as undefined
    console.log("Inside index.js");
    console.log(location);
    console.log(forecast);
    res.send({locationResponse: location, forecastResponse: forecast});
});

Вариант 2: Используйте Promise.all() для ожидания всех обещаний выполнено.

app.get('/forecasts', function (req, res) {
    var list = await Promise.all([getCity(req, res), getForecasts(req, res)]);

    //these are logged as undefined
    console.log("Inside index.js");
    console.log(list[0]);
    console.log(list[1]);
    res.send({locationResponse: list[0], forecastResponse: list[1]});
});
1 голос
/ 27 января 2020

Проблема здесь в том, что в вашем методе ./routes/forecast/ getForecasts вы сообщаете ответ для отправки с данными «Прогноз». Вы должны когда-либо использовать res.send только один раз для каждого запроса, так как это разрешит ответ и вернется к клиенту.

Вместо этого ваш метод getForecasts должен просто возвращать все необходимые данные, а файл индекса должен обрабатывать ответ. Если вам нужен getForecasts для обработки ответа, возможно, из-за того, что вы отправляете запросы непосредственно в конечную точку прогноза, которая не требует данных о местоположении, тогда вы можете реорганизовать свой код, чтобы и индекс, и прогнозы выполняли вызов для получения данных, которые вы нужно. Например:

/* index.js */
const {getCity} = require('./data/city');
const {getForecasts} = require('./data/forecast');

app.get('/forecasts', function (req, res) {
    var location = getCity();
    var forecast = getForecasts();
    res.send({locationResponse: location, forecastResponse: forecast});
});

/* data/forecast.js */
module.exports = {
    getForecasts: () => {
        return "Forecast";
    }
};

/* data/city.js */
module.exports = {
    getCity: () => {
        return "City";
    }
};

Тогда вы также можете иметь:

/* routes/forecast.js */
const {getForecasts} = require('../data/forecast');
module.exports = {
    getForecasts: (req, res) => {
        res.send(getForecasts());
    }
};

Выше может быть слишком сложно, но я сделал предположение, что если вы используете каталог routes , вы, вероятно, хотите, чтобы там хранились обработчики маршрутов. Надеюсь, это поможет.

0 голосов
/ 27 января 2020

Вы можете использовать синтаксис async/await.

app.get('/forecasts', async function (req, res) {
    var location = await getCity(req, res);
    var forecast = await getForecasts(req, res);

    //these are logged as undefined
    console.log("Inside index.js");
    console.log(location);
    console.log(forecast);
    res.send({locationResponse: location, forecastResponse: forecast});
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...