2017-01-22 17 views
2

MongoDBクライアントモジュールがMongoDBデータベースに接続するときに作成される "DB"データベースオブジェクトにアクセスしようとして問題が発生しています。ExpressミドルウェアにMongo DBオブジェクトDBを渡す

現時点では、data.js内に「db」が定義されていないというエラーが表示されています。私はこれがなぜであるのか理解しています.dbオブジェクトはルータに渡されず、その後コントローラに渡されません。

これを行うにはどのような方法が最適ですか?

"db"オブジェクトをルータ(dataRoutes.js)に渡そうとしましたが、コントローラ(data.js)にアクセスできるようにする方法がわかりません。誰かが助けてくれますか?

注意:私は他のルートとコントローラを含んでいませんが、POSTメソッドを介して/ data/submitにフォームを送信するだけです。以下のコントローラは、このフォームデータをMongoDBデータベースに書き込むことを意図しています。ここで

は、関連するコードです:

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

app.jsはreferen db変数を作成します。 app.jsのCEのMongoDB:​​で

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