当对 mongoose 中的特定模式有 post 请求时添加事件侦听器
add a event listener when there is a post request for a specific schema in mongoose
我有两个模式
var customerSchema = mongoose.Schema( {
'joined' : { 'type' : Date, 'required' : true, 'default' : '01/01/1900' },
'fname' : { 'type' : String, 'required' : true, 'default' : '' },
'lname' : { 'type' : String, 'required' : true, 'default' : '' },
'city' : { 'type' : String, 'required' : true, 'default' : '' },
'orderTotal' : { 'type' : Number },
'orders' : [ { 'type' : mongoose.Schema.Types.ObjectId, 'ref' : 'orders' } ]
} );
var orderSchema = mongoose.Schema( {
'product' : { 'type' : String, 'required' : true },
'cost' : { 'type' : Number, 'required' : true },
'quantity' : { 'type' : Number, 'required' : true },
'total' : { 'type' : Number, 'required' : true },
'customer' : { 'type' : mongoose.Schema.Types.ObjectId, 'ref' : 'customers' }
} );
我想要做的是添加订单,然后更新 customerSchema 订单字段。所以我这样做了:
exports.addCustomerOrder = function ( request, reply ) {
var total = request.payload.productQuantity * request.payload.productCost;
var order = new OrderSchema( {
'product' : request.payload.productName,
'cost' : request.payload.productCost,
'quantity' : request.payload.productQuantity,
'total' : total
} ).save( function( err, order ) {
if ( err ) {
return reply( {
'statusCode' : '500',
'error' : err,
'message' : 'Failed to add order'
} );
}
CustomerSchema.update( { '_id' : request.params.id },
{ '$push' : { 'orders' : order._id } },
{ 'upsert' : true },
function( err ) {
if ( err ) {
return reply( {
'statusCode' : '500',
'error' : err,
'message' : 'Failed to add order'
} );
}
reply( order );
} );
} );
};
虽然可以,但是我觉得我这里的做法效率很低。我缺少什么来完全优化我的代码吗?就像为 orderSchema 添加一个事件侦听器,例如当我添加一个新订单时,它会自动将 ID 添加到客户而不是链接两个 api 请求。
今天我学习了 post 钩子!因此,在使用我的 OrderSchema 发出 post 请求时,我没有同时链接两个查询,而是使用了这种事件侦听器。
OrderSchema.post( 'save', function ( next ) {
var Customer = Mongoose.model( 'Customer' );
var conditions = {
'_id' : this.customerId
};
var options = {
'upsert' : true
};
var update = {
'$push' : {
'orders' : this._id
}
};
Customer.update( conditions, update, options, function ( err ) {
if ( err ) {
throw new Error( err );
}
} );
} );
我有两个模式
var customerSchema = mongoose.Schema( {
'joined' : { 'type' : Date, 'required' : true, 'default' : '01/01/1900' },
'fname' : { 'type' : String, 'required' : true, 'default' : '' },
'lname' : { 'type' : String, 'required' : true, 'default' : '' },
'city' : { 'type' : String, 'required' : true, 'default' : '' },
'orderTotal' : { 'type' : Number },
'orders' : [ { 'type' : mongoose.Schema.Types.ObjectId, 'ref' : 'orders' } ]
} );
var orderSchema = mongoose.Schema( {
'product' : { 'type' : String, 'required' : true },
'cost' : { 'type' : Number, 'required' : true },
'quantity' : { 'type' : Number, 'required' : true },
'total' : { 'type' : Number, 'required' : true },
'customer' : { 'type' : mongoose.Schema.Types.ObjectId, 'ref' : 'customers' }
} );
我想要做的是添加订单,然后更新 customerSchema 订单字段。所以我这样做了:
exports.addCustomerOrder = function ( request, reply ) {
var total = request.payload.productQuantity * request.payload.productCost;
var order = new OrderSchema( {
'product' : request.payload.productName,
'cost' : request.payload.productCost,
'quantity' : request.payload.productQuantity,
'total' : total
} ).save( function( err, order ) {
if ( err ) {
return reply( {
'statusCode' : '500',
'error' : err,
'message' : 'Failed to add order'
} );
}
CustomerSchema.update( { '_id' : request.params.id },
{ '$push' : { 'orders' : order._id } },
{ 'upsert' : true },
function( err ) {
if ( err ) {
return reply( {
'statusCode' : '500',
'error' : err,
'message' : 'Failed to add order'
} );
}
reply( order );
} );
} );
};
虽然可以,但是我觉得我这里的做法效率很低。我缺少什么来完全优化我的代码吗?就像为 orderSchema 添加一个事件侦听器,例如当我添加一个新订单时,它会自动将 ID 添加到客户而不是链接两个 api 请求。
今天我学习了 post 钩子!因此,在使用我的 OrderSchema 发出 post 请求时,我没有同时链接两个查询,而是使用了这种事件侦听器。
OrderSchema.post( 'save', function ( next ) {
var Customer = Mongoose.model( 'Customer' );
var conditions = {
'_id' : this.customerId
};
var options = {
'upsert' : true
};
var update = {
'$push' : {
'orders' : this._id
}
};
Customer.update( conditions, update, options, function ( err ) {
if ( err ) {
throw new Error( err );
}
} );
} );