Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 结合Mongo输出和API节点_Node.js_Mongodb_Asynchronous_Express_Keystonejs - Fatal编程技术网

Node.js 结合Mongo输出和API节点

Node.js 结合Mongo输出和API节点,node.js,mongodb,asynchronous,express,keystonejs,Node.js,Mongodb,Asynchronous,Express,Keystonejs,我对Node非常陌生,但我目前有一个NodeJS/Express开源CMS,我想为我正在工作的应用程序输出一些API数据。如果我没有使用正确的术语或诸如此类的东西,请原谅,这对我来说是新的 我现在有两个系列,地点和旅游。CMS允许我在两者之间建立关系。这只是将ObjectID数组存储在每个关联巡更记录的位置记录中 我想做的是获取我的API输出代码(如下),并让它输出整个tours数组,以及每个位置记录中的所有字段(标题、描述等)。目前它只输出一个ID数组 这是我目前的代码: var async

我对Node非常陌生,但我目前有一个NodeJS/Express开源CMS,我想为我正在工作的应用程序输出一些API数据。如果我没有使用正确的术语或诸如此类的东西,请原谅,这对我来说是新的

我现在有两个系列,地点和旅游。CMS允许我在两者之间建立关系。这只是将ObjectID数组存储在每个关联巡更记录的位置记录中

我想做的是获取我的API输出代码(如下),并让它输出整个tours数组,以及每个位置记录中的所有字段(标题、描述等)。目前它只输出一个ID数组

这是我目前的代码:

var async = require('async'),
 landmark = require('keystone');

var Location = keystone.list('Location'),
        Tour = keystone.list('Tour');

    /**
     * List Locations
     */
    exports.list = function(req, res) {
        Location.model.find(function(err, items) {

            if (err) return res.apiError('database error', err);

            res.apiResponse({
                locations: items
            });

        });
    }

    /**
     * Get Location by ID
     */
    exports.get = function(req, res) {
        Location.model.findById(req.params.id).exec(function(err, item) {

            if (err) return res.apiError('database error', err);
            if (!item) return res.apiError('not found');

            res.apiResponse({
                location: item
            });

        });
    }
当前API输出(截断):

我要找的是:

{
  "locations": [
    {
      "_id": "53a47997ebe91d8a4a26d251",
      "slug": "test-location",
      "lastModified": "2014-06-20T20:19:14.484Z",
      "commonName": "test location",
      "__v": 3,
      "url": "",
      "tours": [
        {
           "_id": "53a47963ebe91d8a4a26d250",
           "title": "my test tour title",
           "url": "url_to_audio_file"
        }
      ],
      "images": []
    }
  ]
}
有人知道这是否可能吗?任何帮助都将不胜感激!谢谢

看起来您已经设置了
位置
模型,以引用
巡更
s,定义为
巡更
s的数组。这意味着,当您将
巡更
存储在
位置
内时,您存储的不是表示该
巡更
的数据,而是引用该
巡更
的ID。当您执行
find
操作时,您将在发送回客户端的响应中看到这一点

如果是这种情况,那么您可能想看看。这将获取这些引用并用它们包含的数据完全填充它们

例如,您可以将查询更改为以下内容:

Location.model.find().populate('tours').exec(function(err, items) {
    // items should now contain fully populated tours
}

如果这不是你的意思,请告诉我,我可以尝试进一步提供帮助。

由@dylants提供的解决方案绝对正确。但是,要使其工作,您需要在
位置
列表中将
ref
选项设置为
Tour
tours
声明为
类型.Relationship
字段

查看上的Keystone文档

我在下面的示例中包括了
many
true
选项,因为我假设这是一对多关系。如果不是,你可以丢弃它

var keystone = require('keystone'),
  Location = keystone.list('Location');

Location.add({
   ...
   tours: { type: Types.Relationship, ref: 'Tour', many: true },
   ...
});
您提到的
List.relationship()
方法仅适用于希望相关文档列表自动显示在
Keystone Admin UI
中,而不是建立实际关系的情况


希望这能有所帮助。

感谢您的回复。我也在另一个论坛上发布了这个问题,他们也提出了同样的建议,但是它不起作用。你认为我有我的
位置
模型参考
巡演
是正确的。以下是我如何在
位置
模型中引用
Tour
Location.relationship({path:'tours',ref:'Tour',refPath:'Location')<代码>填充
似乎不起作用。下面是我更新后的代码,用于尝试获取tours:
Location.model.findById(req.params.id).populate({path:'tours',ref:'tours'}).exec(函数(err,item){res.apiResponse({Location:item});})
var keystone = require('keystone'),
  Location = keystone.list('Location');

Location.add({
   ...
   tours: { type: Types.Relationship, ref: 'Tour', many: true },
   ...
});