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 控制台中收到此错误:

未捕获的类型错误:无法读取未定义的属性“拆分”

经过一番调查,似乎错误发生在这段代码中调用的函数 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);。由于请求被拒绝,不应该调用第二个函数(被拒绝的承诺)吗?

看起来 ember-simple-auth-token 正在尝试使用不存在的令牌,因为响应是空的 401。我尝试在被拒绝的请求中包含一个令牌,但我仍然得到同样的错误。

请记住,当响应来自我的本地服务器(甚至是我的真实服务器)时,它工作正常。

我找不到调试海市蜃楼的方法。如何查看有关回复的详细信息?在我的浏览器中,请求不会出现在我的开发人员工具中的网络选项卡下。

接下来我应该研究什么来解决这个问题?

4

1 回答 1

1

使用Mirage.Response而不是Response解决问题。通过使用Response,响应本身为空 ( {}),因此 mirage 默认将其设为空 200 OK。

于 2016-03-12T17:38:22.690 回答