【发布时间】:2021-03-17 09:52:42
【问题描述】:
我在猫鼬中的模型定义如下:
user.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
}
}()
基本上,我返回的是用户模型的客户端可以使用的公共接口。 IE。我的用户路线抓取模型,可以调用定义的两个公共方法,仅此而已。我这样做是为了从我的路线中抽象出我正在使用 mongodb/mongoose 的事实。我很可能会在某个时候拥有一个与 postgres 对话的用户模型,或者可能只是切换到 postgres。因此,我不想通过代码查看调用特定于猫鼬的函数的路由方法中的位置。
这是我的问题。当我需要一个我调用的模块时,代码中的大多数地方
var someUtil = require('./someUtil');
但是,如果我对 mongoose 模型多次执行此操作,我会收到一条错误消息,指出它不能定义两次。
var User = require('./user'); // Cannot put this in more than one file without getting an error.
是否有更好的方法来编写 user.js 文件,这样我可以为我的用户模型提供一个公共接口,但只定义一次架构,以便我可以在该文件上多次调用 require ?
【问题讨论】:
-
AFAIK 节点缓存需要模块的结果,因此上述函数不应运行两次。除此之外,没有理由将代码包装在自执行函数中,只需公开
exports.getUserById = getUserById; //etc之类的方法即可。