NodeJs Express从数组生成获取请求

时间:2019-06-20 15:02:20

标签: javascript node.js typescript express

我的文件夹中有一些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 :(得分:0)

您偶然发现了闭包的概念。发生的事情是,您传递给函数的$('#save-form').click(function () { $.easyAjax({ url: '{{ route('admin.settings.update', ['1']) }}', container: '#editSettings', type: "POST", data: { 'company_name': $('#company_name').val(), 'company_email': $('#company_email').val(), 'company_phone': $('#company_phone').val(), 'website': $('#website').val(), 'address': $('#address').val(), 'currency_id': $('#currency_id').val(), 'timezone': $('#timezone').val(), 'locale': $('#locale').val(), 'latitude': $('#latitude').val(), 'longitude': $('#longitude').val(), '_method' : 'PUT', '_token' : '{{csrf_token()}}' }, redirect: true, file: (document.getElementById("logo").files.length != 0 || document.getElementById("login_background").files.length != 0) ? true : false }) }); 不是x值的副本,而是变量x本身(有点像指针)。这意味着所有函数共享同一个变量,因此一个变量只能有一个值。

解决此问题的经典方法是将x作为参数传递,从而破坏了闭包:

x

ES6引入了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 } 的概念,该概念不会创建闭包。因此,更现代的解决方案是仅使用let而不是let

var