Node.js 访问routes中的app.js变量,但不访问global express
这是我在app.js中的配置:Node.js 访问routes中的app.js变量,但不访问global express,node.js,express,Node.js,Express,这是我在app.js中的配置: var express = require('express') , routes = require('./routes') , user = require('./routes/user') , http = require('http') , path = require('path') , Server = mongo.Server , Db = mongo.Db; , mongo = require('mongodb'); , BSON = mongo.
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path')
, Server = mongo.Server
, Db = mongo.Db;
, mongo = require('mongodb');
, BSON = mongo.BSONPure;
var app = express();
var server = new Server('localhost', 27017, {auto_reconnect: true, });
var db = new Db('tasksdb', server); //i need to remove this "var" to access db in routes
db.open(function(err, db) {
if(!err) {
console.log("Connected to 'tasksdb' database");
db.collection('tasks', {safe:true}, function(err, collection) {
if (err) {
console.log("The 'tasks' collection doesn't exist. Creating it with sample data...");
populateDB();
}
});
}
});
app.get('/', routes.index);
app.get('/tasks', routes.getAllTasks);
在routes/index.js中,我有:
exports.index = function(req, res){
res.render('index', { title: 'Express' });
};
exports.getAllTasks = function (req, res) {
db.collection( 'tasks', function ( err, collection ){ //this "db" is not accessible unless i remove "var" from db in app.js
collection.find().toArray( function ( err, items ) {
res.send(items);
})
})
};
当然,除非我将app.js中的“db”中的“var”删除,然后它变为全局的,我可以在路由中访问它,但我不希望在代码中使用全局变量,也不希望将控制器操作移动到app.js文件中。如何修复它 我不太明白。
db
是否是全局的,有无var
(对我来说,它看起来像是一个全局范围)?此外,你为什么不希望它是全球性的?这是使用globals的一个很好的例子
但它不会在文件之间共享。您必须将其添加到导出中。试试这个:
app.js
exports.db = db;
var db = require("app").db;
app.use(function(req,res,next){
req.db = db;
next();
});
app.get('/', routes.index);
app.get('/tasks', routes.getAllTasks);
routes/index.js
exports.db = db;
var db = require("app").db;
app.use(function(req,res,next){
req.db = db;
next();
});
app.get('/', routes.index);
app.get('/tasks', routes.getAllTasks);
另一种方法是向每个处理程序添加db
,如下所示:
app.js
exports.db = db;
var db = require("app").db;
app.use(function(req,res,next){
req.db = db;
next();
});
app.get('/', routes.index);
app.get('/tasks', routes.getAllTasks);
然后,它应该在任何路由中都可用,如
req.db
当它使用var时,它实际上是文件的全局性的,当我删除它时,它变成全局性的,并且对所有文件都可用。感谢您的帮助-效果很好:)如何从routes/index.js获取任何对象//app.js const app=express()const routes=require('./routes)app.use('/',routes)app.set('anyObj',{})//routes/index.js const express=require('express')const router=express.router()const users=require('./users')router.use('/api/users',users)