Node.js使用MongoClient连接本地MongoDB失败:无报错无连接反馈
问题描述
尝试使用mongodb NPM包连接本地MongoDB,代码如下:
var express = require("express"); var router = express.Router(); var MongoClient = require('mongodb').MongoClient; /* GET home page. */ router.get("/", function (req, res, next) { res.render("index"); }); router.post("/submit", (req, res, next) => { console.log(req.body); MongoClient.connect("mongodb://127.0.0.1:27017/", (err,client) => { if(err){ console.log(err); }else{ console.log('db connected'); client.db('login').collection('users').insertOne(req.body); } }) res.send("form submitted"); }); module.exports = router;
控制台既不显示错误信息,也没有提示数据库已连接。
排查与解决方案
检查MongoDB服务状态
本地MongoDB未启动时,连接请求会一直挂起,不会输出任何日志。执行对应命令启动服务:- Windows:
net start MongoDB - macOS/Linux:
sudo systemctl start mongod
确认服务运行后再测试接口。
- Windows:
修复异步逻辑顺序
当前代码中MongoClient.connect是异步操作,但你在调用后立刻执行res.send,会导致请求提前结束,异步回调还未执行就终止。需将res.send移至回调内,同时记得关闭数据库连接:router.post("/submit", (req, res, next) => { console.log(req.body); MongoClient.connect("mongodb://127.0.0.1:27017/", (err,client) => { if(err){ console.log(err); return res.status(500).send("数据库连接失败"); }else{ console.log('db connected'); client.db('login').collection('users').insertOne(req.body) .then(() => { res.send("form submitted"); }) .catch(insertErr => { console.log(insertErr); res.status(500).send("数据插入失败"); }) .finally(() => { client.close(); }); } }) });添加连接超时配置
给连接请求设置超时时间,避免无限等待,超时后会抛出错误并打印日志:MongoClient.connect("mongodb://127.0.0.1:27017/", { serverSelectionTimeoutMS: 5000 // 5秒超时 }, (err,client) => { // 原回调逻辑 })确认请求体解析配置
如果未在主app文件中配置请求体解析中间件,req.body会是undefined,可能导致后续操作异常。在主文件中添加:const express = require('express'); const app = express(); // 解析表单请求体 app.use(express.urlencoded({ extended: true })); // 解析JSON请求体 app.use(express.json());
内容的提问来源于stack exchange,提问作者Aravind
相关产品推荐
相关产品推荐

