有人可以解释如何在express.js中全局传递数据库变量吗?

时间:2017-03-24 13:01:34

标签: javascript node.js mongodb

已经尝试了很多教程,但不知怎的,我无法弄明白。 我正在使用mongodb和express.js 这是在我的server.js

const express = require('express');
const subdomain = require('express-subdomain');
const bodyParser= require('body-parser');
const MongoClient = require('mongodb').MongoClient;
const routes = require('./routes');
const app = express();
var db;

app.set('view engine', 'pug');

app.use(bodyParser.urlencoded({extended: true}));
app.use(express.static('views'));
app.use(subdomain('api', routes.api));

MongoClient.connect('mongodb://localhost:27017/test', (err, database) => {
  if (err) return console.log(err);
  db = database;
  app.listen(3000, () => {
    console.log('listening on 3000');
  });
});

这是我的routes.js

const express = require('express');
const api = express.Router();

api.get('/', function (req, res) {
  db.collection('test').find().toArray((err, result) => {
    if (err) return console.log(err);
    res.render('api_orders', {test: result});
  });
});

module.exports = {
    api
}

我想在路由中也使用db变量,但它总是给我db没有定义错误(显然)我读到我应该以某种方式导出db var,但无法设法做到这一点

3 个答案:

答案 0 :(得分:0)

相反,我建议你创建另一个文件,你只需要它想要使用它。假设:

db.js:

const MongoClient = require('mongodb').MongoClient;
const db = function(){
    return MongoClient.connect('mongodb://localhost:27017/test', (err, database) => {
      if (err) return console.log(err);
      return database;
    });
}

module.exports = db;

现在,您可以在任何地方使用db

const mydb = require('./db'); // <--require it to use

它可能无法正常工作,因为它没有经过测试,但它可以让你有机会通过。

答案 1 :(得分:0)

这是一个回答问题。我用过

MongoClient.connect('mongodb://localhost:27017/test', (err, database)={
global.bigdb = database
});

并从例如

的路线中调用它
var col = global.bigdb.collection('collectionname');

这是不好的做法吗?重读代码 - 它已经存在了一段时间 - 我也将redis客户端暴露为全局。

任何信息赞赏。没有错误报告,但我很好奇,如果我应该重构。

答案 2 :(得分:0)

app.use(function(req,res,next))
{
  res.locals.yourvariable = null; 
  next();
});

这是我初始化全局变量的方法。希望你有个主意。