Ember.js: ์žกํžˆ์ง€ ์•Š์€ TypeError: ์ •์˜๋˜์ง€ ์•Š์€ 'hasRoute' ์†์„ฑ์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2015๋…„ 08์›” 11์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: emberjs/ember.js

๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•˜๋Š” ์ธ์ฆ ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Auth ์„œ๋น„์Šค์— ์ €์žฅ๋œ ์ด์ „ ์ „ํ™˜์ด ์—†์œผ๋ฉด ํŠน์ • ๊ฒฝ๋กœ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.

์•ฑ์€ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์ด ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ์—์„œ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Uncaught TypeError: Cannot read property 'hasRoute' of undefined

๋””๋ฒ„๊น…/ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฌด์Šจ ์ผ์ด์•ผ?

๋‚ด ์ธ์ฆ ์„œ๋น„์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import Ember from 'ember';
import config from '../config/environment';

export default Ember.Service.extend({
    routing: Ember.inject.service('-routing'),
    loginCapable: true,
    localStorageKey: config.localStorageKeys.user,

    checkAuth(priorTransition){
        this.set('priorTransition', priorTransition);
        return this.get('isLoggedIn');
    },

    isLoggedIn: Ember.computed('user', function(){
        return !!this.get('user');
    }),

    init(){
        this.set('user', JSON.parse(window.localStorage.getItem( this.get("localStorageKey") )) );
    },

    login(adID){
        return Ember.$.ajax(
            config.apiHost + config.apiVersion + "/getLdapInfo",{
                type: 'GET',
                data: "adID="+adID
            }).then(json => {
                this.set('user', json);

                window.localStorage.setItem( this.get("localStorageKey") , JSON.stringify(json));

                var priorTransition = this.get('priorTransition');
                if( priorTransition )
                {
                    priorTransition.retry();
                    this.set('priorTransition', null);
                }else{
                    this.get('routing').transitionTo('index');

                }
            }, xhr => {
                return xhr.responseJSON ? xhr.responseJSON.message : "Login failed";
            });
    }
});

๊ทธ๋ฆฌ๊ณ  ๋‚ด ๋ผ์šฐํ„ฐ:

import Ember from 'ember';
import config from './config/environment';

var Router = Ember.Router.extend({
  location: config.locationType
});

Router.map(function() {
  this.route('authenticated', { path: '/' }, function(){
    this.route('index', { resetNamespace: true });
  });
  this.route('login');
});

export default Router;

ํ•ด๋‹น ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import { moduleFor, test } from 'ember-qunit';
import Ember from 'ember';
import startApp from 'recruiter-admin/tests/helpers/start-app';
import Pretender from 'pretender';

var server,
    application;

var user = [{
            "adID":"uniqueID",
            "first_name":"First Name",
            "last_name":"Last Name",
            "employee_type":"Regular",
            "employee_id":"12345",
            "manager":"CN=managerID,OU=Employees,OU=company Users,DC=company,DC=com",
            "success":true
            }];

function jsonResponse(json, status = 200) {
    return [status, {"Content-Type": "application/json"}, JSON.stringify(json)];
}

moduleFor('service:auth', 'Unit | Service | auth', {
    unit:true,
    needs:['router:main'],
    beforeEach(){
        application = startApp();

        server = new Pretender(function(){
            this.get('/getLdapInfo', function(req){
                return jsonResponse(user.findBy('adID',req.queryParams.adID));
            });
        });
    },

    afterEach(){
        Ember.run(application, 'destroy');
        if( server ){
            server.shutdown();
        }
    }
});

// Replace this with your real tests.
test('it exists', function(assert) {
    var service = this.subject();
    assert.ok(service);
});

test('isLoggedIn Testing', function(assert){
    var service = this.subject();
    assert.ok(service.get('isLoggedIn') === false, 'Not logged in');

    Ember.run(()=>{
        service.set('user', true);
    });

    assert.ok(service.get('isLoggedIn') === true, 'IS logged in');
});

test('can login', function(assert){
    assert.expect(0);

    var service = this.subject();
    Ember.run(()=>{
        service.login('uniqueID');
    });

    andThen(()=>{
        assert.ok(service.get('user'));
    });

});

Ember 2.0.0-beta.5 ์‚ฌ์šฉ

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋น„๊ณต๊ฐœ -routing ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ฉฐ router ์ธ์Šคํ„ด์Šค๊ฐ€ ์ดˆ๊ธฐํ™” ๋ฐ ์„ค์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ์ŠคํŠธ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋ฅผ ์กฐ๋กฑํ•˜๊ฑฐ๋‚˜ ๋ผ์šฐํ„ฐ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 ์„ ์•ฝ๊ฐ„ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ถ๊ทน์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. get(this, 'router') ๊ฐ€ false์ธ ๊ฒฝ์šฐ false) PR์„ ์ œ์ถœํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋น„๊ณต๊ฐœ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ชจ๋“  4 ๋Œ“๊ธ€

๋น„๊ณต๊ฐœ -routing ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ฉฐ router ์ธ์Šคํ„ด์Šค๊ฐ€ ์ดˆ๊ธฐํ™” ๋ฐ ์„ค์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ…Œ์ŠคํŠธ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋ฅผ ์กฐ๋กฑํ•˜๊ฑฐ๋‚˜ ๋ผ์šฐํ„ฐ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/services/routing.js#L37 ์„ ์•ฝ๊ฐ„ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ถ๊ทน์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. get(this, 'router') ๊ฐ€ false์ธ ๊ฒฝ์šฐ false) PR์„ ์ œ์ถœํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋น„๊ณต๊ฐœ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜์ง€๋งŒ ๊ธฐ๊บผ์ด PR์„ ๊ฒ€ํ† ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒŒ์ž„์— ๋Šฆ์—ˆ์ง€๋งŒ ๊ทธ๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚ด๊ฐ€ ํ•œ ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

const service = this.subject({
    routing: {
      transitionTo() {
        return true;
      }
    }
})

๋‹ค๋ฅธ ๊ฒฝ๋กœ ์ž์ฒด๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ ember/service/routing.js ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ember ํŒ€์„ ์‹ ๋ขฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

this.owner.unregister('service:router');
this.owner.register('service:router', mocks.routerService());

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‹คํŒจํ•˜์ง€ ์•Š๊ณ  ์Šคํ„ฐ๋น™ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰