Mongoose - Promise then() 不会在保存时触发

Mongoose - Promise then() not triggered on save

我正在使用 ExpressJS + Mongoose + TypeScript。我创建了一个架构如下

const schema: Schema = new Schema({
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    gender: {
        type: Boolean,
        required: true
    },
    mobile: {
        type: String,
        required: false
    },
    password: {
        type: String,
        required: true
    },
    activationKey: {
        type: String,
        required: false
    },
    isActivated: {
        type: Boolean,
        required: true
    },
    imagePath: {
        type: String,
        required: false
    },
});

我正在使用以下代码保存(插入)新条目

MongoClient.connect('mongodb://MyUsername:MyPassword@ds135757.mlab.com:35777/my-db-us', (err, db) => {
    if (err) {
        console.log('mongoose error: ' + err);
    } else {
        console.log('mongoose db: ' + db);

        const user = new User({
            firstName: 'ee',
            lastName: 'ee',
            email: 'eee@fff.com',
            gender: true,
            mobile: '333',
            password: '333',
            isActivated: true
        });

        user.save().then((someValue) => {
            console.log('saved');
        }).catch((err) => {
            console.log('not saved:' + err);
        });
    }
});

控制台消息

发送正确数据时。已保存未打印

mongoose db: [object Object]

发送错误数据时

mongoose db: [object Object]
not saved:ValidationError: gender: Path `gender` is required.

如果网络断开无法连接MongoDB

mongoose error: MongoError: failed to connect to server [ds135777.mlab.com:35777] on first connect [MongoError: connection 0 to ds135777.mlab.com:35777 timed out]

模块版本

"mongodb": "^2.2.34",
"@types/mongodb": "^3.0.5",
"mongoose": "^5.0.4",
"@types/mongoose": "^5.0.2",

重写示例(解决方案)

const mongoose = require('mongoose');
mongoose.connect('mongodb://MyUsername:MyPassword@ds135757.mlab.com:35777/my-db-us', function(err) {
    if (err) {
        console.log('err: ' + err);
    } else {
        console.log('connected');
        const user = new User({
            firstName: 'ee',
            lastName: 'ee',
            email: 'eee@fff.com',
            gender: true,
            mobile: '333',
            password: '333',
            isActivated: true
        });

        user.save().then((someValue) => {
            console.log('saved');
        }).catch((err) => {
            console.log('not saved:' + err);
        });
    }
});

打印的消息是

connected
saved

我猜你的代码有一个有趣的问题(只是猜测你的变量名约定 ;-))。

你说你使用猫鼬,但你使用本机连接 MongoClient(再次根据变量名猜测)你必须使用猫鼬连接

const mongoose = require('mongoose');

然后只需将 MongoClient 替换为 mongoose

then 不打印任何内容,因为那里什么也没有发生,catch 打印错误,因为验证发生在连接之前

您正在创建标准 MongoClient 连接,这不会影响猫鼬模型。创建 User 模型的连接必须是 open 才能使各种数据库操作起作用。假设 User 模型是使用全局猫鼬对象(例如 mongoose.model('User', userSchema))创建的,那么您必须调用 mongoose.connect() 来激活模型的连接。如果 User 模型是通过 non-global 连接(例如 mongoose.createConnection())创建的,那么您应该确保连接处于 open 状态。

原因是您使用本机客户端进行连接并使用 mongoose 进行建模,这不是正确的方法。使用 mongoose 连接到 Mongo DB URI 并保存架构。