You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.');
    });
});

关键改动说明

  1. 移除原生http模块:直接使用Express的app管理路由和服务,这是Express的标准用法。
  2. 一次性连接MongoDB:在服务启动时完成数据库连接,避免每次请求重复建立连接,提升性能。
  3. 使用Express路由:通过app.get()/app.post()等方法定义路由,每个路由的res是Express响应对象,支持send()/status()等便捷方法。
  4. 完善错误处理:在/read路由中捕获数据库查询错误,返回500状态码和错误信息,避免服务崩溃。
  5. 规范路由拼写:将/delet改为/delete,符合RESTful API命名规范。

修改后,访问/read即可正常返回MongoDB中的数据,不会再出现.send()不是函数或函数循环的问题。

内容的提问来源于stack exchange,提问作者Slamraax

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:42:52