一尘不染

Mongoose和NodeJS项目的文件结构

node.js

目前,我的Mongoose / NodeJS应用程序的/models/models.js文件中包含所有模型(架构定义)。

我想将它们分解成不同的文件,例如:user_account.js,profile.js等。但是,我似乎无法这样做,因为一旦我将这些类分开,我的控制器就会分解并报告“
找不到模块 ”。

我的项目结构如下:

/MyProject
  /controllers
    user.js
    foo.js
    bar.js
    // ... etc, etc
  /models
    models.js
  server.js

我的models.js文件的内容如下所示:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;

mongoose.connect('mongodb://localhost/mydb');

var UserAccount = new Schema({
    user_name       : { type: String, required: true, lowercase: true, trim: true, index: { unique: true } }, 
    password        : { type: String, required: true },
    date_created    : { type: Date, required: true, default: Date.now }
});

var Product = new Schema({
    upc             : { type: String, required: true, index: { unique: true } },
    description     : { type: String, trim: true },
    size_weight     : { type: String, trim: true }
});

我的user.js文件(控制器)如下所示:

var mongoose    = require('mongoose'), 
    UserAccount = mongoose.model('user_account', UserAccount);

exports.create = function(req, res, next) {

    var username = req.body.username; 
    var password = req.body.password;

    // Do epic sh...what?! :)
}

如何将模式定义分成多个文件,并从我的控制器中引用它?当我确实引用它时(在新文件中之后),我得到这个错误:

错误:尚未为模型“ user_account”注册架构。

有什么想法吗?


阅读 369

收藏
2020-07-07

共1个答案

一尘不染

这是一个样本 app/models/item.js

var mongoose = require("mongoose");

var ItemSchema = new mongoose.Schema({
  name: {
    type: String,
    index: true
  },
  equipped: Boolean,
  owner_id: {
    type: mongoose.Schema.Types.ObjectId,
    index: true
  },
  room_id: {
    type: mongoose.Schema.Types.ObjectId,
    index: true
  }
});

var Item = mongoose.model('Item', ItemSchema);

module.exports = {
  Item: Item
}

要从项目控制器中加载它,app/controllers/items.js我会这样做

  var Item = require("../models/item").Item;
  //Now you can do Item.find, Item.update, etc

换句话说,在模型模块中定义模式和模型,然后仅导出模型。使用相对需求路径将模型模块加载到控制器模块中。

要建立连接,请在服务器启动代码(server.js或类似内容)的早期进行处理。通常,您需要从配置文件或环境变量中读取连接参数,如果未提供任何配置,则默认为开发模式localhost。

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost');
2020-07-07