我在猫鼬中定义了如下模型:
用户.js
module.exports = function() {
var mongoose = require('mongoose');
// Creates a new Mongoose Schema object
var Schema = mongoose.Schema;
// Collection to hold users
var UserSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
},{
versionKey: false
}
);
// Creates the Model for the User Schema
var User = mongoose.model('User', UserSchema);
var getUserById = function(id, callback) {
User.findById(id, callback);
}
var getUserByUsername = function(username, callback) {
var query = {username: username};
User.findOne(query, callback);
}
return {
getUserById: getUserById,
getUserByUsername: getUserByUsername
}
}()
Run Code Online (Sandbox Code Playgroud)
基本上我正在返回一个用户模型的客户端可以使用的公共接口。IE 我的用户路由获取模型,可以调用定义的两个公共方法,仅此而已。我这样做是为了从我的路线中抽象出我正在使用 mongodb/mongoose 的事实。我很可能会有一个用户模型在某个时候也与 postgres 对话,或者可能只是切换到 postgres。因此,我不想查看调用 mongoose 特定函数的路由方法中位置的代码。
这是我的问题。当我需要调用的模块时,代码中的大多数地方
var someUtil = require('./someUtil');
Run Code Online (Sandbox Code Playgroud)
但是,如果我对 mongoose 模型不止一次这样做,我会收到一个错误,指出它不能被定义两次。
var User = require('./user'); // Cannot put this in more than one file without getting an error.
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来编写 user.js 文件,这样我就可以为我的 User 模型提供一个公共接口,但只定义一次 Schema 以便我可以在该文件上多次调用 require ?
您应该将 Mongoose 模型与包装它的服务分开。
我建议你有一个模型文件夹,每个模式有 1 个文件,每个文件看起来有点像这样:
'use strict';
var mongoose = require('mongoose'),
Schema = mongoose.Schema
var User = new Schema({
...fields your schema will have
})
//additional virtuals or configuration
module.exports = mongoose.model('User', User)
Run Code Online (Sandbox Code Playgroud)
然后有一个services包含需要该模型的 UserService的文件夹:
var User = require('../models/User')
function UserService(){
//create User, delete User, etc.
}
module.exports = new UserService()
Run Code Online (Sandbox Code Playgroud)
那么从现在开始在您的控制器或路由中只需要 UserService。您不会遇到此类问题,并且您的代码组织得更好。
| 归档时间: |
|
| 查看次数: |
1701 次 |
| 最近记录: |