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

Aurelia doc状态跟随fetch拦截器的 request method

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

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

  • 向正在发出的请求添加一些信息,即发起此请求的路由 .
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
};
  • 在创建请求之前拒绝请求,即用户令牌已过期,因此无需执行请求,该请求将在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!')
});
  • 与第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)?

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

在此先感谢任何意见和建议:)