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 并保存架构。
我正在使用 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 并保存架构。