Nodejs mongoose连接mongodb,重复访问报错
Nodejs mongoose连接mongodb,重复访问报错
<pre><code> var express = require(‘express’); var mongoose = require(‘mongoose’); var router = express.Router();
var Person = mongoose.model(‘Person’,{ id:Number, name:String });
/新增/ router.get(’/insert’, function(req, res){ var student = new Person({ id:1, name:“huop” }); mongoose.connect(“mongodb://localhost:27017/test”); student.save(function(e, product, numberAffected) { if (e) res.send(e.message); var html = “<p>新增的数据为:” + JSON.stringify(product); html += “<p>影响的数据量为:” + numberAffected; res.send(html); }); }); router.get(’/find’,function(request, response){ mongoose.connect(“mongodb://localhost:27017/test”); Person.find({ id: 1 }, function(e, docs) { if (e) response.send(e.message); var html = “<p> 查询到的数据为:” + JSON.stringify(docs); response.send(html); }); }); </code></pre> 以上代码可以正常执行,但是有个问题,就是第一次访问的时候正常,但是刷新一遍就会报错, Trying to open unclosed connection. undefined Error: Trying to open unclosed connection. 应该是重复打开连接失败报错,所以需要关闭连接,我加了一段关闭连接的代码,结果查询结果就成了:查询到的数据为:unde 有谁知道如何处理mongodb数据库连接?
Node.js Mongoose 连接 MongoDB 重复访问报错解决方案
问题描述
在使用 Node.js 和 Mongoose 连接 MongoDB 时,如果每次请求都重新连接数据库,会导致重复连接错误(如 Trying to open unclosed connection
)。这不仅浪费资源,还可能导致应用程序崩溃。
解决方案
为了确保每次请求都能正常工作,我们应该只在应用启动时初始化一次数据库连接。这样可以避免重复连接的问题,并且保证连接的稳定性。
示例代码
以下是修改后的代码示例:
var express = require('express');
var mongoose = require('mongoose');
var router = express.Router();
// 初始化数据库连接
mongoose.connect("mongodb://localhost:27017/test", { useNewUrlParser: true, useUnifiedTopology: true });
var Person = mongoose.model('Person', {
id: Number,
name: String
});
// 新增数据
router.get('/insert', function(req, res) {
var student = new Person({
id: 1,
name: "huop"
});
student.save(function(e, product, numberAffected) {
if (e) res.send(e.message);
var html = `<p>新增的数据为:${JSON.stringify(product)}</p>`;
html += `<p>影响的数据量为:${numberAffected}</p>`;
res.send(html);
});
});
// 查找数据
router.get('/find', function(req, res) {
Person.find({
id: 1
}, function(e, docs) {
if (e) res.send(e.message);
var html = `<p>查询到的数据为:${JSON.stringify(docs)}</p>`;
res.send(html);
});
});
var app = express();
app.use(router);
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
说明
-
初始化连接:
- 在文件顶部使用
mongoose.connect()
方法初始化数据库连接。这应该在应用启动时执行一次。 - 使用
{ useNewUrlParser: true, useUnifiedTopology: true }
配置选项以确保兼容性和性能。
- 在文件顶部使用
-
路由处理:
- 删除了每次请求都调用
mongoose.connect()
的代码。现在,数据库连接已经初始化,所有请求都可以直接使用该连接。
- 删除了每次请求都调用
-
错误处理:
- 在保存或查找数据时,如果有错误发生,会通过
res.send(e.message)
将错误信息返回给客户端。
- 在保存或查找数据时,如果有错误发生,会通过
通过这种方式,你可以避免重复连接的问题,并确保每次请求都能正确地与数据库交互。
直接在程序开始的时候建立数据库连接不行吗?不用每个路由都去连接,那也不科学。
var express = require('express');
var mongoose = require('mongoose');
var router = express.Router();
mongoose.connect("mongodb://localhost:27017/test");
// 其它代码
// 下面的每个路由处理函数中不用再连接了。
任务完成以后加一个关闭数据库连接的语句
刚好遇到这个问题。一个可行方法。新建一个mongoose.js:<pre class=“prettyprint javascript”>var mongoose = require(‘mongoose’); mongoose.connect(‘mongodb://localhost/nuaidibi’); module.exports = mongoose; </pre>每个module中,引用<pre class=“prettyprint javascript”>var mongoose = require(’./mongoose.js’);</pre>下面使用就一样了,不用开关连接。
对头,只要引用一次。终生受用。
如果是多个库的话,用createConnection
不需要为每一个请求都打开一个连接,共用一个就完事了
你遇到的问题是由于在每次请求中都重新连接 MongoDB 数据库,这会导致连接没有正确关闭,并且重复连接会引发错误。正确的做法是在应用启动时建立一个持久化的连接,并在整个应用生命周期中重用该连接。
以下是修改后的代码示例:
const express = require('express');
const mongoose = require('mongoose');
const app = express();
const Person = mongoose.model('Person', {
id: Number,
name: String
});
// 连接 MongoDB 数据库
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true });
app.use('/api', require('./routes'));
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
在路由文件中,移除重复连接的部分:
const express = require('express');
const router = express.Router();
const { Person } = require('../models'); // 假设你的模型定义在这个路径下
// 新增
router.get('/insert', async (req, res) => {
try {
const student = new Person({
id: 1,
name: 'huop'
});
await student.save();
res.send(`新增的数据为:${JSON.stringify(student)}`);
} catch (error) {
res.status(500).send(error.message);
}
});
// 查询
router.get('/find', async (req, res) => {
try {
const docs = await Person.find({ id: 1 });
res.send(`查询到的数据为:${JSON.stringify(docs)}`);
} catch (error) {
res.status(500).send(error.message);
}
});
module.exports = router;
解释
- 全局连接:将数据库连接放在全局位置(如应用启动时),而不是每个请求中。
- 异步操作:使用
async
和await
来简化异步操作的处理,使代码更清晰。 - 错误处理:通过捕获异常来更好地处理错误,而不是直接返回错误信息给客户端。
这样做可以避免重复连接的问题,并使代码更加健壮和易于维护。