ResourceJS:创build嵌套的REST接口w / Mongoose模式+子子文档?

UPDATE

我已经把问题的范围缩小到了主要问题上:

使用ResourceJS的嵌套资源中的示例代码需要两个Mongoose模式,即PARENT和CHILD,并创build这些REST资源:

/parent - (GET), (POST) /parent/:parentId - (GET), (PUT), (DELETE) /parent/:parentId/child - (GET), (POST) /parent/:parentId/child/:childId - (GET), (PUT), (DELETE) 

父母和孩子是2个模型; 一个宣布另一个的父母:

 var Parent = mongoose.model('Parent', new mongoose.Schema({ name: { type: String, required: true } })); var Child = mongoose.model('Child', new mongoose.Schema({ name: { type: String, required: true }, parent: { type: mongoose.Schema.Types.ObjectId, ref: 'Parent', index: true, required: true } })); 

不过 ,我们正试图用一个embedded式文件来实现这一点:

车型/ MyModel.js

 var ChildSchema = new mongoose.Schema({ // variables and ID }, { collection: 'child' }); var ParentSchema = new mongoose.Schema({ // variables and ID children: [ChildSchema] }, { collection: 'parent'}); module.exports = mongoose.model('parent', ParentSchema); 

ResourceJS使用这个函数创buildREST接口:

 Resource(app, route, name, model); 

哪里:

  • 应用程序是快速应用程序。

  • 路由是“安装”这个资源的path。 在嵌套资源中,这可能是“/ parent /:parentId”

  • name – 用于该资源的URLpath的资源的名称。

  • 模型 – 接口的Mongoose模型。

我们希望在模型参数中使用像app.models.parent.child这样的子REST接口,或者类似的东西:

 Resource(app, '/child/:childId', 'child', app.models.parent.child).rest({ // the before handler code }); 

显然,这是行不通的。 对于CHILD,我不确定我在模型参数中input什么样的对象types,而不是实际要求的对象types。

parent /:parentId / child(GET)返回一个[]

parent /:parentId / child /:childId(GET)返回此错误:

{“status”:404,“errors”:[“Resource not found”]}

我们的代码:

index.js

 var express = require('express'); var bodyParser = require('body-parser'); var mongoose = require('mongoose'); var methodOverride = require('method-override'); var _ = require('lodash'); var app = express(); app.use(bodyParser.urlencoded({extended: true})); app.use(bodyParser.json()); app.use(methodOverride('X-HTTP-Method-Override')); app.use(function(req, res, next) { // CORS Support res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); res.header('Access-Control-Allow-Headers', 'Content-Type'); next(); }); app.models = module.exports = { parent: require('./models/MyModel') // should Child be declared ? }; var Resource = require('resourcejs'); // The parent REST interface. Resource(app, '', 'parent', app.models.parent).rest(); // The child REST interface. Resource(app, '/parent/:parentId', 'child', app.models.learn.child).rest({ // ResourceJS seems to append 'Id' to 'parent' var above // before handler, include filter and parent info before: function(req, res, next) { req.body.parent = req.params.parentId; req.modelQuery = this.model.where('parent', req.params.parentId); next(); } }); mongoose.connect('mongodb://localhost/myApp'); mongoose.connection.once('open', function() { app.listen(3000); }); 

眼镜:

所有的依赖都是最新的,并且镜像ResourceJS JSON包中显示的内容:“express”:“^ 4.14.0”,“fast-json-patch”:“^ 0.5.7”,“lodash”:“^” 4.17.4“,”mongodb“:”^ 2.2.16“,”mongoose“:”^ 4.7.5“

这是RESOURCEJS示例代码

 // The parent REST interface. Resource(app, '', 'parent', Parent).rest(); // The child REST interface. Resource(app, '/parent/:parentId', 'child', Child).rest({ // Add a before handler to include filter and parent information. before: function(req, res, next) { req.body.parent = req.params.parentId; req.modelQuery = this.model.where('parent', req.params.parentId); next(); } });