基于MVC架构的Node.js+MongoDB注册表单插入失败及Promise拒绝问题
问题分析与解决
你遇到的两个核心问题:未处理的Promise拒绝错误和数据未插入数据库,根源在于Promise异常未捕获、错误信息未传递,可能还存在数据库连接或字段验证问题。
1. 解决未处理Promise拒绝错误
你的createUserControllerFn是async函数,await userService.createUserDBService(...)时如果Promise被reject,没有对应的catch逻辑,就会触发ERR_UNHANDLED_REJECTION。给controller加上try/catch块捕获异常:
修改后的userController.js:
var userService = require('./userServices'); var createUserControllerFn = async (req, res) => { console.log(req.body); try { var status = await userService.createUserDBService(req.body); console.log("*************************"); console.log(status); console.log("*************************"); res.send({ "status": true, "message": "User created successfully" }); } catch (error) { console.error("用户创建失败详情:", error); res.send({ "status": false, "message": "Error creating user", "error": error.message }); } }
2. 修复数据未插入问题并暴露真实错误
原来的service里reject(false)没有传递具体错误信息,导致你无法知道save失败的原因(比如字段验证不通过、数据库未连接)。需要把实际错误对象传递出去:
修改后的userServices.js(推荐用async/await简化Promise写法):
var userModel = require('./userModel'); var key = '123456799asddfffff'; var encryptor = require('simple-encryptor')(key); module.exports.createUserDBService = async (userDetails) => { // 加密密码 const encryptedPassword = encryptor.encrypt(userDetails.password); // 创建用户实例 const user = new userModel({ firstname: userDetails.firstname, lastname: userDetails.lastname, email: userDetails.email, password: encryptedPassword }); // 保存到数据库,失败会抛出错误 await user.save(); return true; }
如果坚持用原始Promise写法,修改reject逻辑:
module.exports.createUserDBService = (userDetais) => { return new Promise(function myFn(resolve, reject) { var userModelData = new userModel(); userModelData.firstname = userDetais.firstname; userModelData.lastname = userDetais.lastname; userModelData.email = userDetais.email; var encrypted = encryptor.encrypt(userDetais.password); userModelData.password = encrypted; userModelData.save(function resultHandle(error, result) { if (error) { reject(error); // 传递真实错误对象,而非false } else { resolve(true); } }); }); }
3. 关键检查项
- MongoDB连接:确保项目入口文件已正确连接数据库,示例代码:
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/your-database-name', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log("MongoDB连接成功")) .catch(err => console.error("MongoDB连接失败:", err)); - 字段验证:检查请求的
req.body是否包含firstname、lastname、email、password四个必填字段,缺少任何一个都会触发Schema的required验证失败。
效果验证
修改后,当数据库操作失败时,控制台会打印具体错误信息(比如MongoNetworkError表示数据库未连接,ValidationError表示字段缺失),同时接口会返回错误详情,帮助你定位问题。
内容的提问来源于stack exchange,提问作者abi jega
相关产品推荐
相关产品推荐

