gpt4 book ai didi

node.js - 在 NodeJS Mongoose 中推送数组 JSON

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:24 27 4
gpt4 key购买 nike

我已经编写了从 mongodb 获取数据的脚本,以使用获取子数据的函数以 JSON 格式推送数据:

var tree = [];
orgchart.find({ _client: "558f030fd1bdb6ee1859c279", _parent: "root" }, function(err,doc){
// function get child
getChild = function(_client, _parent){
var dj = [];
orgchart.find({ _client : _client, _parent: _parent }, function(err, doc1){
var jsonData1 = JSON.parse(JSON.stringify(doc1));
if(jsonData1.length > 0){
for(var j=0; j<jsonData1.length; j++){
dj.push({ 'text' : '"'+jsonData1[j].name+'"' });
console.log(jsonData1[j].name);
}
}
});

return dj;
};

var jsonData = JSON.parse(JSON.stringify(doc));
if(jsonData.length > 0){
for(var i=0; i<jsonData.length; i++){
tree.push({
'text' : jsonData[i].name,
'children' : JSON.parse(JSON.stringify(getChild(jsonData[i]._client, jsonData[i]._id)))
});
}
}

res.send(tree);
});

我从控制台日志中得到结果:

Level 2A
Level 2B

但是在 JSON 中数据是空的

[
{
"text": "Level 1",
"children": []
},
{
"text": "Level 1B",
"children": []
}
]

我需要这样的数据:

[
{
"text": "Level 1",
"children": [{ "text": "Level 2A" }]
},
{
"text": "Level 1B",
"children": [{ "text": "Level 2B" }]
}
]

我的代码有什么问题,我是 Node JS 新手

最佳答案

我认为这样做 JSON.parse(JSON.stringify(...) 是完全没有必要的,因为您只是转换为字符串,然后再次转换为 json,所以没有用。

您的问题是 getChild 执行查询,并且它是一个异步方法,所以基本上发生的情况如下

var dj = [];
return dj;

这意味着您得到的 [] 正是您所得到的。

您要做的就是在 getChild 中使用回调,以便在查询完成时可以调用它。在下面的代码中,我将向函数 getChild 添加回调;

  getChild = function(_client, _parent, cb){
var dj = [];
orgchart.find({ _client : _client, _parent: _parent }, function(err, doc1){
var jsonData1 = doc1;
if(jsonData1.length > 0){
for(var j=0; j<jsonData1.length; j++){
dj.push({ 'text' : '"'+jsonData1[j].name+'"' });
cb(null, dj)
}
}
});

return dj;
};

现在我们必须调用这个函数并等待结果。

  var jsonData = JSON.parse(JSON.stringify(doc));
if(jsonData.length > 0){
for(var i=0; i<jsonData.length; i++){
getChild(jsonData[i]._client, jsonData[i]._id, function(err, value) {
tree.push({
'text' : jsonData[i].name,
'children' : value
});
})

}
}

这里的问题是,由于回调的原因,res.send(tree)很可能为空。此时,我建议您使用一个名为 d async 的模块,该模块被广泛用于处理此问题。您要使用的是 async.forEach

最后一部分代码将如下所示:

async.forEach(doc, function(jsonData, next) {
getChild(jsonData[i]._client, jsonData[i]._id, function(err, value) {
tree.push({
'text' : jsonData[i].name,
'children' : value
});
next(); //this is needed to know that it must go to the next loop
})
}, function(err, val) {
res.send(tree);
});

完整的代码应该是这样的,我希望它能工作,因为我无法测试它:

var tree = [];
orgchart.find({ _client: "558f030fd1bdb6ee1859c279", _parent: "root" }, function(err,doc){
// function get child
getChild = function(_client, _parent, cb){
var dj = [];
orgchart.find({ _client : _client, _parent: _parent }, function(err, doc1){
var jsonData1 = doc1;
if(jsonData1.length > 0){
for(var j=0; j<jsonData1.length; j++){
dj.push({ 'text' : '"'+jsonData1[j].name+'"' });
cb(null, dj)
}
}
});

return dj;
};

async.forEach(doc, function(jsonData, next) {
getChild(jsonData[i]._client, jsonData[i]._id, function(err, value) {
tree.push({
'text' : jsonData[i].name,
'children' : value
});
next(); //this is needed to know that it must go to the next loop
})
}, function(err, val) {
res.send(tree);
});
});

关于node.js - 在 NodeJS Mongoose 中推送数组 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32548281/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com