2017-01-22 42 views
2

我在尝试访问在MongoDB客户端模块连接到我的MongoDB数据库时创建的“DB”数据库对象时遇到问题。将MongoDB对象数据库传递到Express Middleware

此刻我收到一个错误,指出在data.js中'db'没有被定义。我明白为什么这是 - 数据库对象没有被“传递”到路由器,然后通过控制器。

这样做的最好方法是什么?

我试图将“db”对象传递给路由器(dataRoutes.js),但我无法确定如何使控制器(data.js)可以访问此对象。有人可以帮忙吗?

请注意我没有包含其他路线和控制器,但他们只是通过POST方法提交表单到/ data/submit。下面的控制器旨在将此表单数据写入MongoDB数据库。

下面是相关代码:

app.js

var express = require('express'); 
var path = require('path') 
var MongoClient = require('mongodb').MongoClient; 
var bodyParser = require('body-parser'); 
var app = express(); 

var routes = require('./routes/index'); 
var dataRoutes = require('./routes/dataRoutes'); 

app.use(bodyParser.urlencoded({ extended: false })); 
app.use(express.static(path.join(__dirname, 'public'))); 

// view engine setup 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'pug'); 


MongoClient.connect("mongodb://localhost:27017/m101", function(err, db) { 

    if(err) throw err; 

    console.log("Successfully connected to MongoDB."); 

    app.use('/', routes); // Use normal routes for wesbite 
    app.use('/data', dataRoutes); 


    app.get('/favicon.ico', function(req, res) { 
     res.send(204); 
    }); 

    app.use(function(req, res, next) { 
     var err = new Error('Oops Page/Resource Not Found!'); 
     err.status = 404; 
     next(err); //Proceed to next middleware 
    }); 

    if (app.get('env') === 'development') { 
     app.use(function(err, req, res, next) { 
// update the error responce, either with the error status 
// or if that is falsey use error code 500 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
     }); 
    } 

    app.use(function(err, req, res, next) { 
     console.log('Error'); 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: {} 
     }); 

    }); 

    var server = app.listen(3000, function() { 
     var port = server.address().port; 
     console.log("Express server listening on port %s.", port); 
    }); 

}); 

dataRoutes.js

// router 

    var express = require('express'); 
    var router = express.Router(); 

    // controller references 
    var ctrlsData = require('../controllers/data'); 

    router.post('/submit', ctrlsData.submit); 


    module.exports = router; 

data.js

var MongoClient = require('mongodb').MongoClient; 

var sendJsonResponse = function(res, status, content) { 
    res.status(status); 
    res.json(content); 
}; 

module.exports.submit = function(req, res) { 
    var title = req.body.title; 
    var year = req.body.year; 
    var imdb = req.body.imdb; 

    /* 
    console.log('submitted'); 
    console.log(req.body); 
    sendJsonResponse(res, 201, {title,year,imdb}); 
    */ 

    var title = req.body.title; 
    var year = req.body.year; 
    var imdb = req.body.imdb; 



    if ((title == '') || (year == '') || (imdb == '')) { 
    sendJsonResponse(res, 404, { 
     "message": "Title, Year and IMDB Reference are all required." 
    }); 
    } else { 
     db.collection('movies').insertOne(
      { 'title': title, 'year': year, 'imdb': imdb }, 
      function (err, r) { 
      if (err) { 
       sendJsonResponse(res, 400, err); 
      } else { 
       sendJsonResponse(res, 201, "Document inserted with _id: " + r.insertedId + {title,year,imdb}); 
      } 
      } 
     ); 

    } 

}; 

回答

5

创建db变量参照的文CE的MongoDB在app.js

MongoClient.connect("mongodb://localhost:27017/m101", function(err, db) { 

    app.db = db; 

    //..... 
}); 

在​​,访问dbreq.app

module.exports.submit = function(req, res) { 

    req.app.db.collection('movies').insertOne({ 'title': title, 'year': year, 'imdb': imdb }, 
     function(err, r) {} 
    ) 
}; 
+0

谢谢 - 伟大的答案! – Ctrp