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);
不是全局可访问变量。该变量只能在该模块内访问。
要扩大该变量的使用范围,您有多种选择:
您可以导出变量,以便 require()
您所在的模块可以直接从导出访问模型。
您可以导出一个方法,允许 require()
您的模型随后可以调用的任何人来获取该变量。我将此称为 "pull" 导出模型,其中其他模块 "pull" 来自您的值。
您可以调用其他模块中的方法并将变量发送给它们。我将此称为导出的 "push" 模型,因为您正在向另一个模块发送值。
您可以使用 nodejs global
符号显式声明一个全局变量。 global.Post = mongoose.model('posts', postsSchema);
。并且,然后代码中的其他地方也可以用同样的方式引用它。
我的 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);
不是全局可访问变量。该变量只能在该模块内访问。
要扩大该变量的使用范围,您有多种选择:
您可以导出变量,以便
require()
您所在的模块可以直接从导出访问模型。您可以导出一个方法,允许
require()
您的模型随后可以调用的任何人来获取该变量。我将此称为 "pull" 导出模型,其中其他模块 "pull" 来自您的值。您可以调用其他模块中的方法并将变量发送给它们。我将此称为导出的 "push" 模型,因为您正在向另一个模块发送值。
您可以使用 nodejs
global
符号显式声明一个全局变量。global.Post = mongoose.model('posts', postsSchema);
。并且,然后代码中的其他地方也可以用同样的方式引用它。