запрос-обещание в рамках получения ответа на запрос дублируется?

У меня есть следующий маршрут на моем сервере:

//packages
const express = require('express');
const router  = express.Router();
const rp      = require('request-promise');

//date logic
var today = new Date();
var d = today.getDate();
var m = today.getMonth()+1; //January is 0!
var y = today.getFullYear();
if(d<10) {   d = '0'+d } 
if(m<10) {   m = '0'+m } 
today = y + m + d;

//needs error handling 
//retrieve specific ocr records
router.get('/odds/:bid', (req,res,next) => {

    //sports action API connection
    const actionApi = {
        url: `https://api-prod.sprtactn.co/web/v1/scoreboard/${req.params.bid}?date=${today}`,
        json: true
    }

    //home team, away team, opening odds, and closing odds API pul
    rp(actionApi)
        .then((data) => { 

    const games = data.games

        games.forEach((games) => {

            games.teams.forEach((teams, i) => {
                if (games.home_team_id == games.teams[i].id) {
                    homeTeam.push({home_team: games.teams[i].full_name}); 
                } else if (games.away_team_id == games.teams[i].id) {
                    awayTeam.push({away_team: games.teams[i].full_name}); 
                }
            })

            games.odds.forEach((odds, i) => {
                if (games.odds[i].type == "game" && games.odds[i].book_id == "15") {
                    currOdds.push({
                                    currAwayLine: games.odds[i].ml_away, 
                                    currHomeLine: games.odds[i].ml_home, 
                                    currAwaySpread: games.odds[i].spread_away, 
                                    currHomeSpread: games.odds[i].spread_home, 
                                    currAwayTotal: games.odds[i].total,
                                    currHomeTotal: games.odds[i].total,
                                    homeMlBets: games.odds[i].ml_home_public,
                                    awayMlBets: games.odds[i].ml_away_public,
                                    totalOverBets: games.odds[i].total_over_public,
                                    totalUnderBets: games.odds[i].total_under_public,
                                    spreadHomeBets: games.odds[i].spread_home_public,
                                    spreadAwayBets: games.odds[i].spread_away_public
                                })
                } else if (games.odds[i].type == "game" && games.odds[i].book_id == "30") {
                    openOdds.push({
                                    openAwayLine: games.odds[i].ml_away, 
                                    openHomeLine: games.odds[i].ml_home, 
                                    openAwaySpread: games.odds[i].spread_away, 
                                    openHomeSpread: games.odds[i].spread_home,
                                    openAwayTotal: games.odds[i].total,
                                    openHomeTotal: games.odds[i].total
                                })
                } 
            })
        })

            for (i = 0; i < homeTeam.length; i++) {
                mergRecs.push({
                    homeTeam: homeTeam[i].home_team, 
                    awayTeam: awayTeam[i].away_team,
                    currAwayLine: currOdds[i].currAwayLine,
                    currHomeLine: currOdds[i].currHomeLine,
                    openAwayLine: openOdds[i].openAwayLine,
                    openHomeLine: openOdds[i].openHomeLine,
                    currAwaySpread: currOdds[i].currAwaySpread,
                    currHomeSpread: currOdds[i].currHomeSpread,
                    openAwaySpread: openOdds[i].openAwaySpread,
                    openHomeSpread: openOdds[i].openHomeSpread,
                    currAwayTotal: currOdds[i].currAwayTotal,
                    currHomeTotal: currOdds[i].currHomeTotal,
                    openAwayTotal: openOdds[i].openAwayTotal,
                    openHomeTotal: openOdds[i].openAwayTotal,
                    homeMlBets: currOdds[i].homeMlBets,
                    awayMlBets: currOdds[i].awayMlBets,
                    totalOverBets: currOdds[i].totalOverBets,
                    totalUnderBets: currOdds[i].totalUnderBets,
                    spreadHomeBets: currOdds[i].spreadHomeBets,
                    spreadAwayBets: currOdds[i].spreadAwayBets
                })

            }
            res.send(mergRecs)
    })
    .catch((err) => {
        console.log(err);
    });
})


module.exports = router; //make router exportable

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

Я попытался поместить простой ответ, такой как "res.send('hello world') в запрос на получение, и hello world возвращается нормальное количество раз. Но по какой-то причине полезная нагрузка моего запроса-обещания дублируется, когда она вызывается внутри запрос на получение Я не могу понять, почему это происходит.

Ниже приведен снимок экрана из журнала консоли при двукратном вызове запроса на получение: введите здесь описание изображения


person G. Boyce    schedule 31.05.2018    source источник
comment
Где вы объявляете mergRecs в своем коде? И я не уверен, правильно ли понимаю вашу проблему, можете ли вы показать ожидаемый результат и что вы получаете?   -  person Marcos Casagrande    schedule 31.05.2018
comment
currOdds - глобальный наверное? конечно похоже, что вы просто продолжаете нажимать, нажимать и нажимать на этот бедный глобальный массив   -  person Jaromanda X    schedule 31.05.2018
comment
Вот о чем я думаю @JaromandaX   -  person Marcos Casagrande    schedule 31.05.2018
comment
ах да, есть как минимум ПЯТЬ глобальных переменных, которые никогда не очищаются: mergRecs, currOdds, openOdds, homeTeam и awayTeam   -  person Jaromanda X    schedule 31.05.2018


Ответы (1)


Кажется, вы определяете mergRecs, openOdds, homeTeam и currOdds вне router.get('/odds/:bid', () => {}

И каждый запрос продолжает отправляться в этот массив, поэтому ответ «дублируется».

Вам нужно объявить эти массивы внутри обратного вызова.

router.get('/odds/:bid', (req,res,next) => {
    const mergeRecs = [];
    const currOdds = [];
    const openOdds = [];
    const homeTeam = [];
    /* ... */
});

const mergRecs = [];
function badMiddleware() {
  // mergRecs needs to be declared here
  mergRecs.push('yes');
  console.log(mergRecs);
}

badMiddleware(); // 1 yes
badMiddleware(); // 2 yes
badMiddleware(); // 3 yes


Это только начало ваших проблем. Похоже, вы можете получить доступ к неопределенным индексам currOdds и openOdds, поскольку я сомневаюсь, что эти два массива имеют ту же длину, что и homeTeam. И если они это сделают, будет казаться, что вам очень повезло.

person Marcos Casagrande    schedule 31.05.2018
comment
возможно, вы захотите посмотреть, как используются currOdds, openOdds, homeTeam и awayTeam!!! - person Jaromanda X; 31.05.2018
comment
Да, я вижу много доступа к этим переменным, которых может и не быть. - person Marcos Casagrande; 31.05.2018
comment
Благодарю вас! Я изначально определил свои переменные в файле сервера и никогда не перемещал их в свой маршрут. Теперь работает идеально! - person G. Boyce; 31.05.2018
comment
Проверьте мой обновленный ответ, ваш код может дать сбой в будущем. Я не знаю точного результата этого API, но мне он не нравится. - person Marcos Casagrande; 31.05.2018
comment
вы имеете в виду в отношении частей badModdleware? - person G. Boyce; 31.05.2018
comment
Я имею в виду, что вы полагаетесь на 3 разных массива, заполненных в разных циклах, в разных условиях, чтобы они были одинаковой длины. это: currOdds, openOdds и homeTeam - person Marcos Casagrande; 31.05.2018