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

Express对接MongoDB Atlas提交表单报quotesCollection未定义错误如何解决

错误原因
  • quotesCollection是在MongoClient.connect的then回调内部用const声明的块级作用域变量,仅在该回调内部可访问。你定义在全局作用域的/quotes POST路由不在该变量的作用域范围内,因此读取不到该变量,抛出未定义的引用错误。
修复方案

推荐将路由挂载和服务启动逻辑移入数据库连接成功的回调内,避免出现请求到达时数据库还未连接完成的异常,修改后的完整代码如下:

const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const app = express();

app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html');
});

MongoClient.connect('mongodb+srv://star:wars123@clusterstar2.j9vfh.mongodb.net/myFirstDatabase?retryWrites=true&w=majority', {
        useUnifiedTopology: true
    })
    .then(client => {
        console.log('Connected to Database');
        const db = client.db('star-wars-quotes');
        const quotesCollection = db.collection('quotes');
        
        // 需使用quotesCollection的路由全部放在该回调内部
        app.post('/quotes', (req, res) => {
            quotesCollection.insertOne(req.body)
                .then(result => {
                    console.log(result);
                    res.redirect('/'); // 操作完成后返回首页,避免请求挂起
                })
                .catch(error => console.error(error));
        });

        // 数据库连接成功后再启动服务
        app.listen(3000, () => console.log('Listening on port 3000'));
    })
    .catch(error => console.error(error));

另外你原有代码的POST路由没有给客户端返回响应,会导致请求长时间挂起,上述代码也补充了对应的返回逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:30:03