在Aurelia实施拦截器逻辑的推荐(一般)方法是什么?
Aurelia doc指出了取消拦截器的请求方法:
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 ?
提前感谢任何意见和建议:)