是否可以删除操作挂钩?

时间:2016-04-11 19:09:29

标签: javascript node.js model loopbackjs strongloop

假设我绑定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实例的所有后续测试都有此操作挂钩。有没有办法解开它?

2 个答案:

答案 0 :(得分:1)

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

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

我希望你能发现它有用。

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

答案 1 :(得分:0)

实际上正在浏览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