2013-04-18 27 views
5

Tôi muốn ứng dụng Emberjs của tôi xử lý trạng thái HTTP trái phép (401).Ứng dụng Ember.js sẽ chuyển hướng để đăng nhập, khi dữ liệu ember nhận được trạng thái http 401

Ứng dụng sử dụng dữ liệu ember để tích hợp JSON API (Rails).

Lớp máy khách (Emberjs) sẽ chuyển hướng đến chế độ xem/mẫu Emberjs nhắc đăng nhập, khi nhận trạng thái HTTP trái phép (401).

Tôi làm cách nào để thực hiện việc này cho toàn bộ ứng dụng?

Trả lời

5

Tôi đã gặp khó khăn với cùng một vấn đề. Tôi đã thực hiện thành công bản hack sau.

window.App = Em.Application.extend 
    ready: -> 
    $(document).ajaxError((event, request, settings) => 
     if request.status == 401 && !["/profile", "https://stackoverflow.com/users/sign_in.json"].contains(settings.url) 
     controller = App.__container__.lookup('controller:application') 
     controller.transitionToRoute('sign_in') 
) 

Ý tưởng là bắt một sự kiện jQuery ajaxError. Trong trường hợp bạn có thể kiểm tra loại phù thủy lỗi (.e.g. Request.status == 401), url gây ra lỗi (ví dụ: settings.url) và dựa trên thông tin đó, bạn có thể quyết định việc cần làm.

Hope this helps

+3

Điều này cần được xử lý bởi bộ định tuyến ngay bây giờ, tương tự như sau: http://stackoverflow.com/questions/17981563/?hl=vi -data-handling-401s –

0

Tôi đang nghĩ đến một cách tốt hơn là sử dụng Ember của lời hứa:

@store.get("user").then(=> 
    # Success stuff here 
).fail(=> 
    @transitionTo("login") # Do other fancy error stuff here too 
) 

Vấn đề ở đây là nó sẽ phải được thực hiện trên tất cả các tuyến riêng. Có lẽ bạn có thể làm một cái gì đó với phương pháp beforeTransition, kiểm tra những gì lời hứa trả về? Chỉ là thức ăn cho sự suy nghĩ.

8

Tôi đã nghiên cứu về cùng một chủ đề và có vẻ như thông tin ở đây hơi lỗi thời. Sử dụng Ember 1.7.0, bạn nên xử lý lỗi trong route. Nếu bạn muốn áp dụng điều này cho toàn bộ ứng dụng, bạn nên thêm nó vào lớp ApplicationRoute của bạn, như vậy

// app/routes/application.js 
import Ember from 'ember'; 

var ApplicationRoute = Ember.Route.extend({ 
    actions: { 
     error: function (error, transition) { 
      // Handle the error here 
      if (error && error.status === 401) { 
       return this.transitionTo('login'); 
      } 
     } 
    } 
}); 

export default ApplicationRoute; 

Đây là cách tương tự như các tài liệu mô tả nó: read here

Cập nhật: Trong các phiên bản mới hơn của dữ liệu Ember và Ember, cấu trúc đối tượng lỗi sẽ khác một chút. Trạng thái sẽ là một chuỗi, chứa trong một đối tượng lỗi, trong một mảng lỗi:

actions: { 
    error: function(error, transition) { 
    if (error.errors[0].status === '401') { 
     this.transitionTo('sign-in'); 
    } 
    } 
} 
Các vấn đề liên quan