当对 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 );
        }
    } );
} );