Node.js guide 注册响应报错
Node.js guide 注册响应报错
Express 500 Error: db object already connecting, open cannot be called multiple times
at Db.open (/home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/node_modules/mongodb/lib/mongodb/db.js:257:11)
at User.save (/home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/models/user.js:17:9)
at Object. (/home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/routes/index.js:45:10)
at nextMiddleware (/home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/node_modules/express/node_modules/connect/lib/middleware/router.js:175:25)
at param (/home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/node_modules/express/node_modules/connect/lib/middleware/router.js:183:17)
at pass (/home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/node_modules/express/node_modules/connect/lib/middleware/router.js:191:11)
at Object.router (/home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/node_modules/express/node_modules/connect/lib/middleware/router.js:197:7)
at next (/home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/node_modules/express/node_modules/connect/lib/http.js:204:15)
at next (/home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/node_modules/express/node_modules/connect/lib/middleware/session.js:322:9)
at /home/xuke/Study/缂栫▼瀛︿範璧勬枡/01.缂栫▼璇█/JavaScript/Test/microblog/node_modules/express/node_modules/connect/lib/middleware/session.js:341:9
Node.js Guide: 注册响应报错
问题描述
在使用 Express 和 MongoDB 进行注册操作时,遇到了一个错误信息:
Error: db object already connecting, open cannot be called multiple times
错误分析
这个错误通常发生在你尝试多次打开同一个数据库连接。MongoDB 的 Db
对象在初始化后不应该被重复调用 open()
方法。
示例代码
假设你的项目结构如下:
microblog/
├── node_modules/
├── models/
│ └── user.js
├── routes/
│ └── index.js
└── app.js
models/user.js
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
username: { type: String, required: true },
password: { type: String, required: true }
});
const User = mongoose.model('User', userSchema);
module.exports = User;
routes/index.js
const express = require('express');
const router = express.Router();
const User = require('../models/user');
router.post('/register', async (req, res) => {
const { username, password } = req.body;
try {
const newUser = new User({ username, password });
await newUser.save();
res.status(201).send('User registered successfully');
} catch (error) {
console.error(error);
res.status(500).send('Failed to register user');
}
});
module.exports = router;
app.js
const express = require('express');
const mongoose = require('mongoose');
const bodyParser = require('body-parser');
const indexRouter = require('./routes/index');
const app = express();
// Middleware
app.use(bodyParser.json());
// Database connection
mongoose.connect('mongodb://localhost:27017/microblog', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => {
console.log('Connected to MongoDB');
}).catch((error) => {
console.error('Failed to connect to MongoDB', error);
});
// Routes
app.use('/', indexRouter);
// Start server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
解决方案
确保你的数据库连接只在应用启动时创建一次,并且不要重复调用 mongoose.connect
或 db.open
方法。
通过以上示例代码,你可以看到在 app.js
中我们只在应用启动时连接到数据库,而在其他地方没有重复调用 mongoose.connect
。这样可以避免多次打开数据库连接的问题。
总结
确保你的数据库连接逻辑正确实现,并且只在应用启动时进行一次数据库连接操作。这样可以避免在处理请求时出现重复打开数据库连接的错误。
楼主这编码错得厉害, 是从哪儿贴过来的?
竟然乱码一堆
已经解决了,社区好强大
根据错误信息 Error: db object already connecting, open cannot be called multiple times
,问题在于你在尝试多次打开同一个 MongoDB 数据库连接。MongoDB 驱动程序不允许在同一时间多次调用 open()
方法来连接数据库。
解决方案
你应该确保只创建一个数据库连接,并在整个应用中重用它。你可以使用连接池或者在应用启动时初始化数据库连接,然后在需要时使用该连接。
示例代码
首先,在应用启动时初始化数据库连接:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/mydatabase', {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => console.log('Connected to database'))
.catch(err => console.error('Could not connect to database', err));
接下来,在你的 User
模型或其他需要使用数据库的地方,你可以直接使用已经建立好的连接:
const User = mongoose.model('User', new mongoose.Schema({
// your schema fields
}));
module.exports = User;
在路由处理函数中,你可以像这样使用 User
模型:
const express = require('express');
const User = require('./models/user');
const router = express.Router();
router.post('/register', async (req, res) => {
const { username, password } = req.body;
try {
const user = new User({ username, password });
await user.save();
res.status(201).send(user);
} catch (error) {
res.status(500).send(error.message);
}
});
module.exports = router;
通过这种方式,你可以避免多次打开数据库连接的问题。确保在全局范围内只创建一次数据库连接,并在需要时重用它。