NodeJs Express генерирует запрос на получение из массива - PullRequest
0 голосов
/ 20 июня 2019

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

Код работает кроме одной вещи

localhost/Foo.json
Prints {Name:Bar} => expected Foo

localhost/Bar.json
Prints {Name:Bar} => expected Bar

, поэтому всегда отображается последняя запись в массиве данных

interface filesPath{
   name:string,
   ext:string, //here .json
   filepath:string,
}

var generateJson = (files:filesPath[]) => {
   var dataFiles = [];
   var dataNames = [];
   for(var x in files){
      dataFiles[x] = require(files[x].filepath);
      dataNames[x] = files[x].name;

      app.get('/'+dataNames[x]+files[x].ext,(req, res) => {
          res.json(dataFiles[x])  //Returns always last entry in array
      });
   }
}

Есть ли простое исправление? Заранее спасибо

1 Ответ

0 голосов
/ 20 июня 2019

Вы наткнулись на концепцию замыканий.Происходит то, что x, который вы передаете своей функции, является не копией значения x, а самой переменной x (вроде указателя).Это означает, что все функции имеют одну и ту же переменную, поэтому одна переменная может иметь только одно значение.

Классический способ решить эту проблему - передать x в качестве аргумента, тем самым нарушив замыкание:

for(var x in files){
  dataFiles[x] = require(files[x].filepath);
  dataNames[x] = files[x].name;

  app.get('/'+dataNames[x]+files[x].ext,((new_x) => (req, res) => {
      res.json(dataFiles[new_x])
  })(x)); // <-- pass in x here to become new_x
}

ES6 представил концепцию let, которая не создает замыкание.Поэтому более современное решение - просто использовать let вместо var:

for(let x in files){ // <-- this fixes it!!
  dataFiles[x] = require(files[x].filepath);
  dataNames[x] = files[x].name;

  app.get('/'+dataNames[x]+files[x].ext,(req, res) => {
      res.json(dataFiles[x])
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...