将Mongo DB Object DB传递给Express Middleware

Ctr*_*trp 2 javascript mongodb node.js express

我在尝试访问MongoDB客户端模块连接到MongoDB数据库时创建的"DB"数据库对象时遇到问题.

目前我收到一条错误,指出在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);
    });

});
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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});
            }
          }
        );

  }

};
Run Code Online (Sandbox Code Playgroud)

Ber*_*tel 9

创建一个db引用mongodb 的变量app.js:

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

    app.db = db;

    //.....
});
Run Code Online (Sandbox Code Playgroud)

data.js,访问db来自req.app:

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

    req.app.db.collection('movies').insertOne({ 'title': title, 'year': year, 'imdb': imdb },
        function(err, r) {}
    )
};
Run Code Online (Sandbox Code Playgroud)


Cha*_*bot 6

接受的答案并不完全正确。您不应该将自定义对象附加到该app对象。这就是app.locals目的。另外,使用 Typescript 时接受的答案将会失败。

app.locals.db = db;

router.get('/foo', (req) => {
    req.app.locals.db.insert('bar');
});
Run Code Online (Sandbox Code Playgroud)

当然,更长了。但您可以得到保证,ExpressJS 的未来更新不会干扰您的对象。