Node.js 无法跨多个文件识别模型定义

Node.js does not recognize model definitions across multiple files

我的 app.js require 这些文件:

var fs = require('fs');
var http = require('http');
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');

// Custom Modules
fs.readdirSync(__dirname + '/models').forEach(function(filename) {
    if (filename.indexOf('.js')) require(__dirname + '/models/' + filename)
});

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

因此,如您所见,首先是 mongoose,然后是 /models/ 中的模型文件,最后是 /routes/ 中的路由文件。在其中一个模型文件 posts.js 中,我定义了这个:

var Post = mongoose.model('posts', postsSchema);

由于 require 顺序,我认为 Post 可以从 /models/ require 下方 的任何地方访问。但是,从 /routes/index.js 中像下面这样访问 Post 会引发错误,提示 Post 未定义:

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');

router.get('/submit/', function (req, res) {
    var submission = new Post({
        // ...
    });
});

我可以从 /models/posts.js 中访问 Post,但不能从其他任何地方访问。我的错误是什么?提前致谢。

每个模块都存在于它自己的命名空间中,因此常规的顶级变量定义如:

var Post = mongoose.model('posts', postsSchema);

不是全局可访问变量。该变量只能在该模块内访问。

要扩大该变量的使用范围,您有多种选择:

  1. 您可以导出变量,以便 require() 您所在的模块可以直接从导出访问模型。

  2. 您可以导出一个方法,允许 require() 您的模型随后可以调用的任何人来获取该变量。我将此称为 "pull" 导出模型,其中其他模块 "pull" 来自您的值。

  3. 您可以调用其他模块中的方法并将变量发送给它们。我将此称为导出的 "push" 模型,因为您正在向另一个模块发送值。

  4. 您可以使用 nodejs global 符号显式声明一个全局变量。 global.Post = mongoose.model('posts', postsSchema);。并且,然后代码中的其他地方也可以用同样的方式引用它。