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

时间:2015-02-18 23:58:45

标签: node.js mongoose

我的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 / second中的模型文件和/ routes / last中的路径文件。在其中一个模型文件posts.js中,我定义了这个:

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

由于需要订单,我认为Post可以从下面的 / models / require访问。但是,从Post中访问/routes/index.js之类的内容会引发错误,说明Post未定义:

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

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

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

1 个答案:

答案 0 :(得分:0)

每个模块都位于其自己的命名空间中,因此是常规的顶级变量定义,例如:

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

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

要扩展可以使用该变量的范围,您有以下几种选择:

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

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

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

  4. 您可以使用nodejs global符号显式声明全局。 global.Post = mongoose.model('posts', postsSchema);。并且,代码中的其他位置可以以相同的方式引用它。