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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:20:48