Aurelia中拦截器实施的最佳实践

时间:2017-06-01 22:42:41

标签: javascript aurelia interceptor aurelia-fetch-client aurelia-http-client

在Aurelia实施拦截器逻辑的推荐(一般)方法是什么?

Aurelia doc指出了取消拦截器的请求方法

  

request [method]获取拦截器运行后将传递给window.fetch()的Request。它应返回相同的请求,或创建新的。它还可以返回响应以将对fetch()的调用短路并立即完成请求。请求拦截器中的抛出错误将由requestError拦截器处理。

考虑到这一点,让我们考虑3个样本用例:

  1. 将一些信息添加到正在发出的请求中,即启动此请求的路由。

    request(requestMessage) {
        requestMessage.urlHash = window.location.hash;
    
        return requestMessage;
    }
    

    a)向 requestMessage 配置对象添加一些数据是一种好方法 - 改变当前配置并返回它吗?

    b)也许最好返回一个包含config的新对象,因此 requestMessage 是不可变的?类似下面的代码。我想,fetch不会使用这个传递的对象而不是 requestMessage 本身。

    return { 
        request: requestMessage,
        urlHash: window.location.hash,
        someOtherData: data
    };
    
  2. 在创建请求之前拒绝请求,即用户令牌已过期,因此无需执行请求,这将在API端失败,只是拒绝请求。

    request(requestMessage) {
        if (authenticationService.isTokenExpired()) {
            requestMessage.tokenExpired = true;
    
            // We can use reject or throw here
            // Let's be explicit and return promises as applying interceptors logic
            // is based on promise chaining
            return Promise.reject(requestMessage); 
        }
    
        return Promise.resolve(requestMessage);
    }
    

    a)在这种情况下,与上述相同的问题,是否建议修改 requestMessage 以向被拒绝的请求添加一些数据?也许我们应该在被拒绝的承诺中返回一个自定义的错误,比如新的TokenExpiredError(requestMessage)?

    b)在被拒绝的承诺中返回不同的对象是否合适?例如:

    return Promise.reject({
        request: requestMessage,
        error: new TokenExpiredError('User token expired!')
    }); 
    
  3. 与第1点类似的用例,但让我们考虑响应拦截器方法。逻辑是阻止在不同路由(散列片段)上发出的请求并在当前路由中解析 - 在导航到新路由后基本解决。

    response(responseMessage) {
        const currentUrlHash = window.location.hash;
        const requestMessage = responseMessage.requestMessage;
    
        if (requestMessage.urlHash !== currentUrlHash) {
            responseMessage.blockedRequest = true;
    
            return Promise.reject(responseMessage);
        }
    
        return Promise.resolve(responseMessage);
    }
    

    a)如何处理这种情况,我们在请求之前使用信息集?

    b)在哪里放这种数据?

    c)如何处理阻止,可能拒绝自定义错误就足够了,比如新的BlokedReuqestError(responseMessage)?

  4. 最后一件事,如何从拦截器方法(不是请求或响应消息)返回自定义对象会影响使用标准配置添加的默认拦截器 - rejectErrorResponses

    提前感谢任何意见和建议:)

0 个答案:

没有答案