Поэтому я пытаюсь защитить конечную точку API, чтобы только пользователь, владеющий объектом, мог получить сведения об этом объекте.
API возвращает ответ 403, а также JSONAPI-совместимую полезную нагрузку json, равную:
{
"errors": [
{ "status": "403", "title": "Forbidden", "detail": "You are not authorized to access this resource" }
]
}
Отлично!Поэтому в данный момент я пытаюсь подключиться к жизненному циклу маршрута, чтобы перевести пользователя на домашнюю страницу, если он попытается посмотреть на ресурс, принадлежащий кому-то другому.
https://www.emberjs.com/api/ember-data/release/classes/DS.AdapterError подразумевает, что этотак же просто, как добавление действия ошибки в маршрут и выполнение любых действий для его обработки.
//routes/my-resource.js
export default Route.extend({
model(params) {
this.store.findRecord('my-resource', params.id)
}
});
//routes/application.js
export default Route.extend(ApplicationRouteMixin, {
actions: {
error(error, transition) {
debugger
}
}
});
Я никогда не включал этот отладчик, потому что действие ошибки никогда не вызывалось.Я попробовал это на уровне маршрута приложения и определенного уровня маршрута.Вместо этого маршрут загружается как обычно, но в консоли есть общая Ember Error (вставлена ниже), и, очевидно, ресурс не находится в хранилище.
Я немного не понимаю, что попробовать.Я подключился к handleResponse на уровне адаптера и попытался вручную выдать DS.ForbiddenError, но маршрут по-прежнему не вызывает перехват ошибок.
Uncaught ErrorClass {isAdapterError: true, stack: "Error: Ember Data Request GET /api/my-resource… (http://localhost:4200/assets/vendor.js:3609:31)", description: undefined, fileName: undefined, lineNumber: undefined, …}code: undefineddescription: undefinederrors: [{…}]fileName: undefinedisAdapterError: truelineNumber: undefinedmessage: "Ember Data Request GET /api/my-resource/2 returned a 403↵Payload (Empty Content-Type)↵[object Object]"name: "Error"number: undefinedstack: "Error: Ember Data Request GET /api/my-resource/2 returned a 403↵Payload (Empty Content-Type)↵[object Object]↵ at ErrorClass.EmberError (http://localhost:4200/assets/vendor.js:13638:31)↵ at ErrorClass.AdapterError (http://localhost:4200/assets/vendor.js:90664:17)↵ at new ErrorClass (http://localhost:4200/assets/vendor.js:90682:24)↵ at Class.handleResponse (http://localhost:4200/assets/vendor.js:103063:18)↵ at Class.handleResponse (http://localhost:4200/assets/vendor.js:110305:19)↵ at Class.superWrapper [as handleResponse] (http://localhost:4200/assets/vendor.js:53436:28)↵ at ajaxError (http://localhost:4200/assets/vendor.js:103345:25)↵ at ajaxErrorHandler (http://localhost:4200/assets/vendor.js:103372:12)↵ at Class.hash.error (http://localhost:4200/assets/vendor.js:103140:23)↵ at fire (http://localhost:4200/assets/vendor.js:3609:31)"__proto__: EmberError
onerrorDefault @ rsvp.js:24
trigger @ rsvp.js:66
(anonymous) @ rsvp.js:886
invoke @ backburner.js:247
flush @ backburner.js:167
flush @ backburner.js:326
_end @ backburner.js:748
end @ backburner.js:513
_run @ backburner.js:793
_join @ backburner.js:769
join @ backburner.js:567
join @ index.js:164
hash.error @ rest.js:880
fire @ jquery.js:3268
fireWith @ jquery.js:3398
done @ jquery.js:9307
(anonymous) @ jquery.js:9548
load (async)
send @ jquery.js:9567
ajax @ jquery.js:9206
_ajaxRequest @ rest.js:893
_ajax @ rest.js:913
(anonymous) @ rest.js:883
initializePromise @ rsvp.js:397
Promise @ rsvp.js:877
ajax @ rest.js:873
findRecord @ rest.js:436
Ember.RSVP.Promise.resolve.then @ -private.js:9195
tryCatcher @ rsvp.js:200
invokeCallback @ rsvp.js:372
(anonymous) @ rsvp.js:436
(anonymous) @ rsvp.js:14
invoke @ backburner.js:247
flush @ backburner.js:167
flush @ backburner.js:326
_end @ backburner.js:748
end @ backburner.js:513
_run @ backburner.js:793
_join @ backburner.js:769
join @ backburner.js:567
join @ index.js:164
(anonymous) @ index.js:265
mightThrow @ jquery.js:3534
process @ jquery.js:3602
setTimeout (async)
(anonymous) @ jquery.js:3640
fire @ jquery.js:3268
fireWith @ jquery.js:3398
fire @ jquery.js:3406
fire @ jquery.js:3268
fireWith @ jquery.js:3398
ready @ jquery.js:3878
completed @ jquery.js:3888