2017-01-22 7 views
2

Ich habe Probleme beim Zugriff auf das Datenbankobjekt "DB", das erstellt wird, wenn das MongoDB-Clientmodul eine Verbindung mit meiner MongoDB-Datenbank herstellt.Übergabe der Mongo DB-Objekt-DB an Express Middleware

Im Moment bekomme ich eine Fehlermeldung, dass in data.js 'db' nicht definiert ist. Ich verstehe, warum das so ist - das db-Objekt wird nicht zum Router und dann zum Controller weitergeleitet.

Was ist der beste Weg, dies zu tun?

Ich habe versucht, das "db" -Objekt durch den Router (dataRoutes.js) zu übergeben, aber ich kann nicht herausfinden, wie dies für den Controller (data.js) zugänglich gemacht wird. Könnte jemand bitte helfen?

Bitte beachten Sie, dass ich die anderen Routen und Controller nicht eingeschlossen habe, sondern einfach ein Formular über die POST-Methode an/data/submit senden. Der folgende Controller soll diese Formulardaten in die MongoDB-Datenbank schreiben.

ist hier der entsprechende Code:

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

    } 

}; 

Antwort

5

Erstellen Sie eine Variable, die db referen ce mongodb in app.js:

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

    app.db = db; 

    //..... 
}); 

In data.js, Zugang db von req.app:

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

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

Dank - große Antwort! – Ctrp

Verwandte Themen