Node.js服务器无法返回MongoDB数据,请求技术支持
问题分析与解决
你的代码核心问题是同时混用了原生http模块和Express框架,导致响应对象不匹配,且没有正确利用Express的路由机制。以下是具体问题点和修复方案:
具体问题点
- 引入Express却未使用它的路由系统,反而用
http.createServer包裹逻辑,这里的res是原生HTTP响应对象,并非Express的响应对象,因此没有send()方法,这就是报错的根源。 - 直接
return response不符合HTTP服务器的响应逻辑:原生HTTP需要调用res.end()/res.write()返回数据,Express则用res.send(),但你的实现路径完全错误。 - 每次请求都执行
await client.connect(),这是低效且错误的——MongoDB客户端会自动维护连接池,只需在服务启动时连接一次即可。
修复后的完整代码
require('dotenv').config(); const { MongoClient } = require('mongodb'); const express = require('express'); const cors = require('cors'); const app = express(); // 启用CORS和JSON解析 app.use(cors()); app.use(express.json()); // 全局MongoDB数据库实例 let db; // 服务启动时一次性连接MongoDB async function connectToDB() { const client = new MongoClient(process.env.MONGO_URL); try { await client.connect(); console.log('Connection OK!'); db = client.db('ArtisanTest'); } catch (err) { console.error('MongoDB连接失败:', err); process.exit(1); // 连接失败直接退出服务 } } // 定义路由 app.get('/', (req, res) => { res.send('首页内容'); }); app.post('/create', async (req, res) => { // 此处编写创建数据逻辑,例如: // await db.collection('phones').insertOne(req.body); res.send('创建成功'); }); app.get('/read', async (req, res) => { try { const phonesCollection = db.collection('phones'); const phones = await phonesCollection.find().toArray(); res.send(phones); // 使用Express的res.send返回数据 } catch (err) { console.error('查询失败:', err); res.status(500).send('查询数据失败'); } }); app.put('/update', async (req, res) => { // 此处编写更新数据逻辑 res.send('更新成功'); }); app.delete('/delete', async (req, res) => { // 此处编写删除数据逻辑(修正原路由拼写delet为delete,符合REST规范) res.send('删除成功'); }); // 先连接数据库,再启动Express服务 connectToDB().then(() => { app.listen(5000, () => { console.log('Node.js web server is running at port 5000.'); }); });
关键改动说明
- 移除原生http模块:直接使用Express的
app管理路由和服务,这是Express的标准用法。 - 一次性连接MongoDB:在服务启动时完成数据库连接,避免每次请求重复建立连接,提升性能。
- 使用Express路由:通过
app.get()/app.post()等方法定义路由,每个路由的res是Express响应对象,支持send()/status()等便捷方法。 - 完善错误处理:在
/read路由中捕获数据库查询错误,返回500状态码和错误信息,避免服务崩溃。 - 规范路由拼写:将
/delet改为/delete,符合RESTful API命名规范。
修改后,访问/read即可正常返回MongoDB中的数据,不会再出现.send()不是函数或函数循环的问题。
内容的提问来源于stack exchange,提问作者Slamraax
相关产品推荐
相关产品推荐

