【发布时间】:2015-02-19 08:53:41
【问题描述】:
我的 app.js requires 这些文件:
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);
由于需要顺序,我认为 Post 可以从 /models/ 要求的任何地方下方访问。但是,从/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,但不能从其他任何地方访问。我的错误是什么?提前致谢。
【问题讨论】:
-
要使用变量 Post 您需要先分配变量。像这样:
var Post = require('path/to/your/models/post')不过,要将其烘焙到您的 forEach 中,您还需要做更多的工作。考虑您的自动化是否真的有必要。您可能会发现手动执行它会使其更具可读性。 -
方法是在你的其他文件中
require('mongoose'),然后通过var Post = mongoose.model('Post')访问Post -
谢谢!我发现我还必须在 /modules/posts.js 的末尾附加
module.exports = Post;以便模型传递。我想知道,如果我必须在我的路由文件中单独要求这些 .js 文件,为什么我还要在 app.js 中要求这些文件?这是正确的做法吗? -
你不必像那样导出它,只要你使用 mongoose 从模式中创建模型,任何需要相同 mongoose 副本的东西都可以使用
model('modelName')方法。 -
看看这个boilerplate project你可以感受一下这样做的一种方式