如何更新Node.js中的一对多关系?

我正在使用一个使用mongoosemongodbrestify的Node应用程序。 我想知道在定义路由function时是否有从各种模型导入代码的好习惯。 这应该是一个相当直接的问题,我只需要指导,我就可以自己编写代码。 感谢您抽时间阅读。

我知道如何定义这种关系,但是我不确定我应该如何去build立真正的关系。 也就是说,换句话说,当一辆汽车被创造出来的时候,最好的方法是给它添加一辆汽车。

请注意,我正在试图保持这个api RESTful。

我有两个模型,我将不得不基于下面的模式,这是存储在db/schema.js

 //schema.js var restify = require('restify'); var mongoose = require('mongoose'); var Schema = mongoose.Schema; var ObjectId = Schema.ObjectId; // User Schema exports.User = new Schema({ id: ObjectId, name: String, cars: [{ type: ObjectId, ref: 'Car' }], }); // Car Schema exports.Car = new Schema({ id: ObjectId, name: String, _user: { type: ObjectId, ref: 'User' }, }); 

然后,我在models/...创build模型,其中每个模型都有不同的文件。 现在他们每个人只有一行代码,但是当我需要编写模型方法时,我把它们作为独立的文件。

models/car.js

  mongoose.model('Car', db_schema.Car); 

models/user.js

  mongoose.model('User', db_schema.User); 

最后,我build立了这个post的路由,并把请求放在routes/cars.js

这不是全部,只是回答我的问题的必要条件。

  module.exports = function(app) { function putCar(req, res, next) { Car.findById(req.params.id, function (err, car) { if (!err) { car.name = req.params.name; car.save(function (err) { if (!err) { // PLACE A // current_user = get current user from session // current_user.cars.push(car); res.send(car); return next(); } else { return next(new restify.InternalError(err)); } }); } else { return next(new restify.MissingParameterError('ObjectId required.')); } }); } function postCar(req, res, next) { var car = new Car(req.params); car.save(function (err, car) { if (!err) { // PLACE B // current_user = get current user from session // current_user.cars.push(car); res.send(car); } else { return next(err); } }); } app.post('api/car', postCar); app.put('/api/car', putCar); } 

将代码伪代码置于A和B的地方是否合适? 我想到的问题是我需要在routes / cars.js文件中要求用户模型,这使得模块化变得更加简单。 在models / car.js中做这个会更好吗?

我不同意假设你需要一个模式。 我相信有95%的人使用Mongoose,他们真的不需要它,因为像这样定义模式的好处并没有超过人们在做什么的弊端。 如果在应用程序中validation数据对象与模式匹配有一些关键和不寻常的作用,那么这可能是不同的。 但是,无论如何,你必须在前端做到这一点,我不认为大多数系统真的需要以不同的方式在后端重复这种努力。

对绝大多数情况来说,数据库相对较小且简单。 你的情况可能不是一个例外。 所以我们实际上利用了我们有一个无模式数据库的事实并丢失了样板。

看起来你正在计划为每个集合编写大量的样板代码。 不要这样做。 相反,请看看Node的一些CRUD系统,如下所示: https : //github.com/AndrewRademacher/auto-crud MongoDB是否有本地REST接口? 和/或您可以添加到他们为您的特定需求。

我认为这个关于把汽车添加到后端用户对象的通用哲学的某些部分可能与安全性有关。 换句话说,假定你不能只用前端的话来保存用户对象,因为有人可能试图破解前端。 再次,绝大多数情况下,我不认为这是一个明智的假设。

我认为如果你只是在后端使用一些通用的方式来执行CRUD,并将汽车添加到前端的用户数据对象,那将会更加简单。 如果您真的需要(即有一个有效的商业理由,像是影响底线),那么您可以在通用CRUD系统的后端进行细粒度的安全性。

主要是从几乎所有数据库都是基于SQL的,并且在后端具有静态语言的僵化模式的持久信念系统,所以你几乎不得不使用一堆锅炉代码或依靠元编程,这是棘手的与静态语言。

我认为,在95%的情况下,现在我们拥有诸如JSON和dynamic语言之类的东西,但有一堆样板只是由实体名称和字段名称区分是错误的。

我会提出两点build议:

  1. 如果你期望它们增长得相对较大的话,将路由文件中的函数代码抽象到每个其余函数的控制器中。

  2. 或者,可以在每个表的周围创build自己的DAO(数据库访问对象)包装器,然后在使用更简单的路由文件进行调用时,将它们视为JavaScript对象而不是表格。