在需要时丢失全局variables

我想全局定义一些东西(下划线库,mongoose,数据库连接,最终一个权限对象)

app.js

/* module dependencies */ const express = require('express'); const auth = require('http-auth'); const underscore = require('underscore'); const expressValidator = require('express-validator'); const mongo = require('mongodb'); const db = require('./library/db'); /*end module dependencies */ /*routes files*/ const post = require('./routes/post'); /* end route files */ /* start the app instance */ var app = express(); /* authentication */ var basic = auth({ authRealm : "Private area.", authList : ['Shi:many222', 'Lota:123456'] }); /* end authentication*/ /* pass app as an argument to the use method */ app.configure(function () { app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(expressValidator); app.use(db); //app.use(underscore); /* config debugging */ app.configure('development', function(){ app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); /* production instance */ app.configure('production', function(){ app.use(express.errorHandler()); }); /* end config debugging */ }); /* start route management */ app.get('/post', function(req, res) { basic.apply(req, res, function(username) { post.use(app); post.findAll(req, res); }); }); app.get('/post/:id', function(req, res) { post.findById(req, res); }); /* port management */ var port = 8000; app.listen(port); console.log('Listening: port: '+port); 

post.js

  // Module dependencies const underscore = require("underscore"); // placeholder for app instance var app; // add a use function to exports that we can access from our app exports.use = function (appInstance) { // make app instance available in post.js app = appInstance; }; /* find all rows */ exports.findAll = function(req, res) { console.log('Post:findAll'); app.db.collection('Post', function(err, collection) { collection.find({},{limit: 100}).toArray(function(err, items) { res.send(exports.parseModels(items)); }); }); }; /* parse a single or all items passed to it for formatting */ exports.parseModels = function (items) { underscore.each(items, function(key, val) { console.log('underscore parsed an object'); }); return items; }; 

db.js

 var mongo = require('mongodb'); var Server = mongo.Server, Db = mongo.Db, BSON = mongo.BSONPure; var server = new Server('localhost', 27017, {auto_reconnect: true}); var db = new Db('website', server); db.open(function(err, db) { if(!err) { //do an error here } }); exports.db = db; 

我有问题得到数据库在正确的范围内,目前当在post.js中调用一个查询,我得到这个错误:

  ost:findAll TypeError: Cannot call method 'collection' of undefined at Object.exports.findAll (/Github/-api-v3/routes/post.js:19:10) at /Github/-api-v3/app.js:53:10 at Basic.apply (/Github/-api-v3/node_modules/http-auth/lib/auth/basic.js:48:4) at /Github/-api-v3/app.js:51:9 at callbacks (/Github/-api-v3/node_modules/express/lib/router/index.js:161:37) at param (/Github/-api-v3/node_modules/express/lib/router/index.js:135:11) at pass (/Github/-api-v3/node_modules/express/lib/router/index.js:142:5) at Router._dispatch (/Github/-api-v3/node_modules/express/lib/router/index.js:170:5) at Object.router (/Github/-api-v3/node_modules/express/lib/router/index.js:33:10) at next (/Github/-api-v3/node_modules/express/node_modules/connect/lib/proto.js:199:15) 

每个模块都以自己的范围在一个闭包中运行。 这意味着您定义的任何variables只能在该模块中访问。 任何想让外部可见的方法或variables都应该添加到module.exports对象中。

如果你真的需要定义一个全局variables,那么你需要把它作为属性添加到global对象中,但这应该保持在绝对最小值。

正确的做法是要求在每个模块中使用任何依赖的模块。 所以你应该做var _ = require("underscore");post.js如果你想_引用下划线。

如果您需要post.js来了解您的app实例,则应该将其作为parameter passing给post.jsmodule.exports对象中可用的函数。

post.js

 // Module dependencies const _ = require("underscore"); // placeholder for app instance var app; // add a use function to exports that // we can access from our app exports.use = function (appInstance) { // make app instance available in post.js app = appInstance; // app.db is also accessible } // add the rest of the methods here 

app.js

 // Module dependencies const express = require('express'); const auth = require('http-auth'); const _ = require('underscore'); const expressValidator = require('express-validator'); const post = require('./routes/post'); // create app instance var app = express(); // require db into app.db app.db = require("./db"); // pass app as an argument to the use method post.use(app); 

注意:我更喜欢使用const来build立依赖关系,以便与普通variables/实例区分开来。 另请注意, exportsmodule.exports的缩写。