如何将来自 Mongoose 的 JSON 映射到 Vue 和 Quasar?

How to map JSON coming from Mongoose to Vue and Quasar?

我有一个 Mongoose 后端并编写了一些 REST APIs 来为我的 Vue/Quasar 前端提供数据。它仍然是基本的,使用 Node/Express http 进行 API 调用,还没有 Axios 等。我有一些简单的 CRUD get/put/post/delete API 工作,但现在有一个更复杂的,它基于特定的 Mongoose 查询 return 我的 children 一个节点。

Mongoose 以这种格式向我提供数据:

{“kinder”: [ {name: value, …}, {name: value, …} ] }  

这似乎是一个包裹在 object 中的数组。我不知道如何在 Mongoose/backend 端更改该格式。

前端的 Vue 和 Quasar 需要使用来自 Mongoose 的这些值中的一些(不是全部),但他们希望它是

形式的纯数组
[ {name: value, ...}, {name: value, ...} ]

我需要插入一些新的名称:值对供 Quasar 使用,此外还有来自后端的内容..

从 Vue 组件的 onLazyload 方法执行我的 REST 调用后,为了从后端获取 children,我可以在 Chrome Vue 工具中完美地看到 children,所以我认为 REST API 调用按设计工作。它也可以直接通过 localhost:8080/api/baustoff/kinder/<_id> 完美运行,以上述格式提供 children。

我的问题在于将 REST 响应数据映射到 Vue/Quasar 所需的内容,代码也在 REST 调用之后的 onLazyLoad 方法中(见下文)。

我尝试对下面的代码进行各种更改,例如按照其他地方的建议使用 JSON.parse,但失败了。我认为主要问题是如何处理这个嵌套数组?

这是 Vue 组件端的代码(onLazyLoad 方法)不起作用:

onLazyLoad({ node, key, done, fail }) {
      let parent_id = node._id; 
      // REST call to get the children of a parent node from Mongoose
      http
        .get("/baustoff/kinder/"+parent_id)
        .then(response => {
            // If no children, return empty tree array
          if (response.data == null) {
            done([]);
            return;
          }
          // Process to create Vue/Quasar QTree array with data from REST
          // PROBLEMATIC CODE STARTS PROBABLY HERE!!!!!!!!!!!!!!!
          let donvis = response.data;
          let treeNodes = []; // array to prep the children as needed by QTree 
          for (let i = 0; i < donvis.length; i++) {
                 treeNodes[i] = {
                 fachlicherTyp: donvis[i].fachlicherTyp,
                 _id: donvis[i]._id,
                 lazy: true,
                 parent_id: parent_id, 
               };    
          }
          done(treeNodes); //Draw tree by Quasar/vue QTree
          this.treeChange++; // Marking tree change to Quasar
          return null;
      })
        .catch(e => {
          console.log(e);
        });
    }, // /onLazyLoad()

问题:代码永远不会进入 for 循环,因为 donvis.length 未定义 - 我的错,因为我肯定没有正确处理响应。

我更愿意在上面的 Vue 代码中得到一个解决方案,因为我担心我将不得不处理其他类似的麻烦情况。

我也希望得到有关如何更好地准备 Mongoose 端的 JSON 输出的提示,例如摆脱 {"children:" }。它的 Mongoose 查询是这样的:

Baustoff
  .findById(req.params.baustoffId)
  .select('kinder -_id') 
  .populate('kinder','name baumKnotenTyp fachlicherTyp aktiv produkt') 
   .lean().exec ( (err, baustoff) => { callback(err, baustoff, res) })
};

如果我没理解错的话,donvis就是mongoose的数据,是一个对象。 对象没有长度 属性

你应该试试这个:

donvis.kinder.forEach(child => {
  treeNodes.push({
    fachlicherTyp: child.fachlicherTyp,
    _id: child._id,
    lazy: true,
    parent_id: parent_id,
  })
})

我正在使用 forEach,因为我认为它使事情更具可读性。如果你不知道如何使用它,请告诉我。

请注意,我还使用 treeNodes.push(...) 而不是 treeNodes[i] = ... 这是填充数组的更标准方法