Express Middleware выполняется дважды - PullRequest
0 голосов
/ 21 ноября 2018

Я написал промежуточное ПО, которое обновляет некоторую переменную, которая у меня есть в кеше, поэтому, если срок действия данных должен истечь, он будет обновлен, но на самом деле это происходит дважды и не является хромом, я использую Firefox.Это мой js-файл сервера (я прокомментировал усы экспресс как шаблоны, чтобы быть уверенным, что это не из-за этого):

const express = require('express') ;

const path = require('path');
var mustacheExpress = require('mustache-express');
var request = require('request');
var {updateAllDecks} = require('./utils/deck-request');
var cache = require('memory-cache');

const port = process.env.PORT || 3000;
var app = express();    

// Register '.html' extension with The Mustache Express
app.engine('html', mustacheExpress());
app.set('view engine','mustache');

app.set('views', __dirname + '/views');

//const publicPath = path.join(__dirname, '/public');
//app.use('/', express.static(publicPath));

app.use(function (req, res, next) {
  debugger;
  updateAllDecks(next);
})

app.get('/', (req, res) => {
     res.send('hola');
});

app.listen(port, () => {
  console.log(`Server is up on port ${port}`);
});

Поэтому, когда я иду в '/' через браузер, вызывается updateAllDecks ():

var rp = require('request-promise-native');
var cache = require('memory-cache');
var {Deck} = require('../classes/deck');
var cacheDeck = require('./cache-decks');
var moment = require('moment');


var updateDeck =  async (set,resolve) => {
  //console.log(`${cacheDeck.getCachedExpirationDate(set)}  > ${moment(Date.now()).unix()}`);

    if (cacheDeck.getCachedExpirationDate(set) > moment(Date.now()).unix()) {
      //let deck =  await getDeckCached(set);
      console.log('Cached Deck Back');
      resolve();

    } else {
      let url = `https://playartifact.com/cardset/${set}/`;
      console.log('Getting URL');
      response = await  rp({url:url, json: true});
      var deck = new Deck(set, response.expire_time);
      getDeckRequest(deck,response,resolve)

    }


}

var getDeckRequest =  async (deck, body,resolve) => {
    console.log('Caching deck', deck);
    response = await rp({url:body.cdn_root + body.url.substring(1), json: true});
    deck.setName(response.card_set.set_info.name.english);
    deck.setCards(response.card_set.card_list);
    cacheDeck.addDeck(deck);
    console.log(cacheDeck.getCachedDecksNames());
    resolve();

}

var getDeckCached = (id) => {
  return new Promise((resolve,reject) =>  {
      resolve(cacheDeck.getCachedDeckById(id));
  });
}

var updateAllDecks = (callback) => {

  let decks = [0,1];
  var request = decks.map((deck) =>  {
    return new Promise( (resolve) => {
       updateDeck(deck,resolve);
    });

  });

  Promise.all(request).then(() => {
    callback();
    console.log('Finished');
  });
};

module.exports = {updateAllDecks}

Обратный вызов ();в updateAllDecks () функция - это вызов next () для перехода к отображению страницы.

1 Ответ

0 голосов
/ 23 ноября 2018

Добавил эту строку кода в функцию промежуточного программного обеспечения, чтобы узнать, что это был за звонок.

console.log(req.method, req.path)

Оказалось, что это был звонок из браузера на сервер, чтобы получить значок, который сделал экспресс для вызовапромежуточное программное обеспечение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...