Express对接MongoDB Atlas提交表单报quotesCollection未定义错误如何解决
错误原因
quotesCollection是在MongoClient.connect的then回调内部用const声明的块级作用域变量,仅在该回调内部可访问。你定义在全局作用域的/quotesPOST路由不在该变量的作用域范围内,因此读取不到该变量,抛出未定义的引用错误。
修复方案
推荐将路由挂载和服务启动逻辑移入数据库连接成功的回调内,避免出现请求到达时数据库还未连接完成的异常,修改后的完整代码如下:
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
相关产品推荐
相关产品推荐

