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

6 回复

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.connectdb.open 方法。

通过以上示例代码,你可以看到在 app.js 中我们只在应用启动时连接到数据库,而在其他地方没有重复调用 mongoose.connect。这样可以避免多次打开数据库连接的问题。

总结

确保你的数据库连接逻辑正确实现,并且只在应用启动时进行一次数据库连接操作。这样可以避免在处理请求时出现重复打开数据库连接的错误。


db 对象不能重复打开. 问题出在你的 User.save中,请贴出源代码以便分析

楼主这编码错得厉害, 是从哪儿贴过来的?

竟然乱码一堆

已经解决了,社区好强大

根据错误信息 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;

通过这种方式,你可以避免多次打开数据库连接的问题。确保在全局范围内只创建一次数据库连接,并在需要时重用它。

回到顶部