我想知道如何使用MEAN堆栈应用程序中的数据库连接.特别是,何时应该创建与数据库的连接,何时应该销毁与数据库的连接.我应该在每个新的HTTP请求上创建和销毁连接,还是应该存储一次创
这是一个例子.
这是我的routes.js文件,带有路由/索引.对此路由的请求应从MongoDb数据库中获取一些日期.现在我困扰我如何连接和断开数据库.是的,我完全按照Mongoose docs中的说法连接和断开数据库,但它是在严肃的生产环境中正确的方式吗?
var express = require('express'); var router = express.Router(); var config = require('./db-config'); // I create a Mongoose instance as a module object, // as opposite to create it in every request handler function below. var mongoose = require('mongoose'); var productSchema = require('../db/productSchema'); // model schema is also a module-wide object // And here is a request handler function. // It is called on every request as a brand new. // I create and destroy a database connection inside this request handler router.get('/index', function(req, res, next) { // I connect to a database on every request. // Do I need to do it here in a request handler? // May I do it outside of this request handler on a module-wide level? mongoose.connect('mongodb://my_database'); // I create a new connection here in a request handler. // So it lives only during this request handler run. // Is this the right way? May I do it outside of this request handler // on a module-wide level and somehow keep this connection and use it // in every subsequent requests to this or any other route in the app? var db = mongoose.connection; db.on('connecting', function() { console.log('connecting'); }); db.on('connected', function() { console.log('connected'); }); db.on('open', function() { console.log('open'); }); db.on('error', console.error.bind(console, 'connection error')); db.once('open', function(cb) { var Product = mongoose.model('Product', productSchema); Product.find({category: "books"}, function(err, prods) { if (err) return console.error(err); // I close a connection here in a callback. // As soon as successfully fetched the data. // Do I need to close it after every request? // What is the right place and time to do it? db.close(disconnect); res.json(prods); }); }); })
找到了一些好的答案:
https://softwareengineering.stackexchange.com/questions/142065/creating-database-connections-do-it-once-or-for-each-query
What are best practices on managing database connections in .NET?
将数据库连接放在单独的模块中的最佳实践(db.js)var mongoose = require('mongoose') mongoose.connect('mongodb://localhost/dbname', function(){ console.log('mongodb connected') }) module.exports = mongoose
每个模型都应该有一个单独的模块,它接受数据库连接(post.js)
var db = require('../db.js') var Post = db.model('Post', { username: {type: String, required: true}, body: {type: String, required: true}, date: { type: Date, required: true, default: Date.now } }) module.exports = Post
然后,只要您需要使用该数据集,只需要它并进行调用
var Post = require('/models/post') Post.save() Post.find()