【问题标题】:NodeJs Express generate get request from an arrayNodeJs Express 从数组生成获取请求
【发布时间】:2019-06-20 15:02:20
【问题描述】:

我有一个文件夹,里面有一些 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
      });
   }
}

有简单的解决方法吗? 提前致谢

【问题讨论】:

  • 当您将空数组设置为 dataFilesdataNames 时,您基本上是在覆盖现有值
  • 是的,你是对的,但问题仍然存在,总是读取最后一个值

标签: javascript node.js typescript express


【解决方案1】:

您偶然发现了闭包的概念。发生的情况是,您传递给函数的 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])
  });
}

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 2018-03-15
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多