0

私の Ember アプリには、ログイン用のアクションがあります。

login: function(emailAddress, password) {
  this.get('session').authenticate('authenticator:jwt', {
      'identification': emailAddress,
      'password': password
  }).catch((reason) => {
      console.log('Reason: ' + JSON.stringify(reason));
      this.set('errorMessage', 'Login failed.');
  });
}

サーバー ( http://127.0.0.1:8091 ) でテストすると、正常に動作します。応答が 200 の場合、ログインしています。401 の場合、エラー メッセージが設定されています。

問題は ember-cli-mirage で発生します。テスト用に次のコードがあります。

this.post('http://127.0.0.1:8091', function(db, req) {
  let body = JSON.parse(req.requestBody);
  if (body.handler === 'test@example.com!' && body.password === 'secretpassword') {
    return {
      token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImFiYzEyMyJ9.X0O3xMVikn-5l9gXBU5a2XF6vlMmTzm4mCqUNA68e-A',
      id: 'abc123'
    };
  } else {
    return new Response(401, {}, {});
  }
});

テストトークンを送信するだけで、資格情報が正しい場合に機能します。アプリにログインできます。しかし、間違った資格情報で試してみると、JS コンソールに次のエラーが表示されます。

キャッチされていない TypeError: 未定義のプロパティ 'split' を読み取ることができません

少し調べたところ、次のコードで呼び出される関数 getTokenData 内でエラーが発生しているようです。

authenticate: function authenticate(credentials, headers) {
  var _this2 = this;

  return new _ember['default'].RSVP.Promise(function (resolve, reject) {
    var data = _this2.getAuthenticateData(credentials);

    _this2.makeRequest(_this2.serverTokenEndpoint, data, headers).then(function (response) {
      _ember['default'].run(function () {
        var token = _ember['default'].get(response, _this2.tokenPropertyName);
        var tokenData = _this2.getTokenData(token);
        var expiresAt = _ember['default'].get(tokenData, _this2.tokenExpireName);
        var tokenExpireData = {};

        _this2.scheduleAccessTokenRefresh(expiresAt, token);

        tokenExpireData[_this2.tokenExpireName] = expiresAt;

        response = _ember['default'].merge(response, tokenExpireData);

        resolve(_this2.getResponseData(response));
      });
    }, function (xhr) {
      _ember['default'].run(function () {
        reject(xhr.responseJSON || xhr.responseText);
      });
    });
  });
},

と書かれている行を参照してくださいvar tokenData = _this2.getTokenData(token);。リクエストが拒否されたので、2 番目の関数 (拒否されたプロミス) を呼び出すべきではありませんか?

応答が空の 401 だったため、ember-simple-auth-token が存在しないトークンを操作しようとしているようです。拒否された要求にもトークンを含めようとしましたが、それでも同じエラーが発生します。

応答がローカル サーバー (および実際のサーバー) から送信された場合、正常に動作することを覚えておいてください。

Mirage をデバッグする方法が見つかりませんでした。回答の詳細を確認するにはどうすればよいですか? ブラウザから開発者ツールの [ネットワーク] タブにリクエストが表示されません。

これを修正するには、次に何を調べる必要がありますか?

4

1 に答える 1