在环回中跳过删除操作,发送自定义响应对象

时间:2015-08-18 12:34:56

标签: node.js express loopbackjs strongloop

我想覆盖strongloop中的默认删除操作,并用某种" soft delete"替换它们。它只是设置了一个要删除的标志。我到目前为止得到它,我挂钩了原始操作,并且没有调用next()函数,操作不允许数据库。但它也没有发送任何响应状态。那么最好的方法是什么,或者发送自定义响应对象?

module.exports = function (Module) {
  Module.observe('before delete', function(ctx, next) {
    id = ctx.where['id'];
    Module.update({id: id}, {deleted: true}, null);
    //next(); // don't call next to avoid deleting
  }); 

更新:不是解决方案,但至少会触发API的某些响应:

Module.observe('before delete', function(ctx, next) {
    var id = ctx.where['id'];
    Module.update({id: id}, {deleted: true}, null);

    // dirty method to trigger response
    var err = new Error();  // create new error object
    err.statusCode = 204;   // set response code to empty response
    next(err);

  });

1 个答案:

答案 0 :(得分:1)

修改 这是正确的答案:

module.exports = function(Model) {
  let app;
  Model.once('attached', (a) => {
    app = a;

    const deleteById = Model.deleteById;

    Model.deleteById = (id, options, cb) => {
      Model.updateAll({id: id}, {
        deletedAt: new Date(),
        deletedBy: options.accessToken.userId,
      });
      cb(null,'deleted')
    };

    // ...
  });
}

在LB2和LB3中,一种方法是使用操作挂钩。在相关的model.js文件中添加:

module.exports = function(Model) {
  let app;
  Model.once('attached', (a) => {
    app = a;
    Model.observe('before delete', (ctx, next) => {
      Model.findById(ctx.where.id, (err, instance) => {
        if (err) {
          return next(err);
        }
        instance.deletedAt = new Date();

        // ...
        // other modifications to instance
        // ...

        // save this in the hookState to retrieve it in after delete hook
        ctx.hookState.deletedModelInstance = instance;
        next();
      });
    });

    Model.observe('after delete', (ctx, next) => {
      Model.replaceOrCreate(ctx.hookState.deletedModelInstance,
        (err, instance) => {
          if (err) {
            console.log(
              'An error occured while restoring data ' +
              'from hookState after delete operation'
            );
          }
        next();
      });
    });
  });
}