是否可以删除操作挂钩?

Is it possible to remove an operation hook?

假设我绑定了一个 operation hook 用于测试目的,如下所示:

it('verification link confirms mail',function(done){
    var client = app.models.client;
    client.observe('after save', function(ctx, next) {
        if (!ctx.instance.verificationToken){
            next();
            return;
        }
        var link = '/api/clients/confirm?uid=' + ctx.instance.id + '&redirect=/verified&token=' + ctx.instance.verificationToken;
        json('get', link)
            .send()
            .expect(200, function(){
                client.findById(ctx.instance.id, function(err, inst){
                    assert(inst.emailVerified === true);
                    done();
                });
            });
        next();
    });
    client.create({username:'test',email : 'a@b.com', password : 'test'}, function(err){
        if(err) {
            assert.fail('could not create client instance','',err);
        }
    });

});

问题是创建client实例的所有后续测试都有这个操作钩子。有办法解绑吗?

我不认为环回提供了一种安全地取消观察操作挂钩的方法。我认为他们使用的 Object.observe 方法在某些 javaScript 实现中已经过时了。我建议你尝试这样的事情:

client.unobserve('after save', function (ctx, next) {
        //do something after the change is un-observed in the object
});

我希望你觉得这很有用。

您可以阅读更详细的内容here这是一个过时的功能,所以要小心

实际浏览loopback-datasource-juggler源代码我找到了解除绑定operation hook的方法。函数 Model.removeObserver('event',call) 完成这项工作。这是更新后的代码:

it('verification link confirms mail',function(done){
    function observeClient(ctx, next) {
        if (!ctx.instance.verificationToken){
            next();
            return;
        }
        var link = '/api/clients/confirm?uid=' + ctx.instance.id + '&redirect=/verified&token=' + ctx.instance.verificationToken;
        json('get', link)
            .send()
            .expect(200, function(){
                client.findById(ctx.instance.id, function(err, inst){
                    assert(inst.emailVerified === true);
                    client.removeObserver('after save',observeClient);//unbind
                    done();
                });
            });
        next();
    }
    var client = app.models.client;
    client.observe('after save', observeClient);
    client.create({username:'andi',email : 'andi@b.com', password : 'test'}, function(err){
        if(err) {
            assert.fail('could not create client instance','',err);
        }
    });
});

可以找到测试用例示例here