【问题标题】:ExpressJS require() load order and Mongoose missing ModelSchemaExpressJS require() 加载顺序和 Mongoose 缺少 ModelSchema
【发布时间】:2015-10-10 08:59:26
【问题描述】:

我正在学习 MEAN 堆栈,发现自己遇到了一个似乎没有意义的加载顺序问题。

下面的代码显示了我的 server.js 加载路由文件,该文件又为模型拉入控制器,这反过来又需要模型本身。

如果我不包含对来自 routes.js 的模型的引用,我会在启动服务器时收到 MissingSchemeError。为什么?我是否遗漏了有关加载资源的内容?

我的理解是,在尝试运行任何代码之前,文件的导出将由 require() 完全导入。

server.js

// modules =================================================
var express             = require('express');
var bodyParser      = require('body-parser');
var methodOverride  = require('method-override');
var mongoose            = require('mongoose');
var morgan              = require('morgan');
var app                 = express();
// configuration ===========================================

// config files
var db = require('./config/db');

// set our port
var port = process.env.PORT || 8080; 

// connect to our mongoDB database 
mongoose.connect(db.url); 

// get all data/stuff of the body (POST) parameters
// parse application/json 
app.use(bodyParser.json()); 

// parse application/vnd.api+json as json
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); 

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true })); 

// override with the X-HTTP-Method-Override header in the request. simulate DELETE/PUT
app.use(methodOverride('X-HTTP-Method-Override')); 

// set the static files location /public/img will be /img for users
app.use(express.static(__dirname + '/public')); 

// set morgan to log requests
app.use(morgan('dev'));

// routes ==================================================
require('./app/routes')(app); 

routes.js

//this line is the problem. why is this needed?
var Customer = require('./models/customer'); // <--
var customers = require('./controllers/customer-server-controller');


module.exports = function(app) {

    app.route('/api/customers')
        .get(customers.list);
        //.post(customer.create);

}

客户服务器控制器.js

var     mongoose = require('mongoose');
var     Customer = mongoose.model('Customer');

/**
 * List of Customers
 */
exports.list = function(req, res) { 
    Customer.find().sort('-created').exec(function(err, customers) {
        if (err) {
            return res.status(400).send({
                message: "ERROR: " + err
            });
        } else {
            res.jsonp(customers);
        }
    });
};

this tutorial on Scotch.io 获得了很大一部分生物板

【问题讨论】:

  • 为什么在 routes.js 中还需要 Customer 模型?您只需要在客户控制器中使用它。

标签: node.js mongoose mean-stack


【解决方案1】:

我认为您缺少教程中的模型

你应该在某个地方有这个。

创建模型文件夹并添加 todo.js 并添加以下内容:

 // define model =================
    var Todo = mongoose.model('Todo', {
        text : String
    });

【讨论】:

  • 不,我使用的是我自己的模型(客户),它在控制器文件的顶部引用。正如我所说,如果我将 require 语句放在 routes.js 和控制器的顶部,它适用于我的模型。
  • 如果你在前几行移动你的路线需求怎么办?主要是在mongoose被调用之前?
【解决方案2】:

您的 customer-server-controller.js 没有 require() 模型文件,它只是通过向 Mongoose 请求它来尝试引用模型(Mongoose 不会为您加载模型文件!):

var Customer = mongoose.model('Customer');

您需要 require() 控制器中的模块文件,否则模型未在 Mongoose 中注册,您会收到错误消息。

【讨论】:

  • 这很有趣。文档表明您是正确的,但我使用该调用而不是 require() 的原因是前端阅读 meanJS 代码。今晚更新并测试。谢谢:)
猜你喜欢
  • 2015-11-19
  • 2012-01-31
  • 2021-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多