在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?
在此先感谢任何意见和建议:)