多次在猫鼬模型上调用 require

los*_*ion 0 mongoose node.js

我在猫鼬中定义了如下模型:

用户.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 ?

arg*_*g20 5

您应该将 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。您不会遇到此类问题,并且您的代码组织得更好。