request.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. var constants = require('./constants');
  2. var utils = require('./utils');
  3. var Session = require('./session');
  4. var loginLib = require('./login');
  5. var noop = function noop() {};
  6. var buildAuthHeader = function buildAuthHeader(session) {
  7. var header = {};
  8. if (session && session.id && session.skey) {
  9. header[constants.WX_HEADER_ID] = session.id;
  10. header[constants.WX_HEADER_SKEY] = session.skey;
  11. }
  12. return header;
  13. };
  14. /***
  15. * @class
  16. * 表示请求过程中发生的异常
  17. */
  18. var RequestError = (function () {
  19. function RequestError(type, message) {
  20. Error.call(this, message);
  21. this.type = type;
  22. this.message = message;
  23. }
  24. RequestError.prototype = new Error();
  25. RequestError.prototype.constructor = RequestError;
  26. return RequestError;
  27. })();
  28. function request(options) {
  29. if (typeof options !== 'object') {
  30. var message = '请求传参应为 object 类型,但实际传了 ' + (typeof options) + ' 类型';
  31. throw new RequestError(constants.ERR_INVALID_PARAMS, message);
  32. }
  33. var requireLogin = options.login;
  34. var success = options.success || noop;
  35. var fail = options.fail || noop;
  36. var complete = options.complete || noop;
  37. var originHeader = options.header || {};
  38. // 成功回调
  39. var callSuccess = function () {
  40. success.apply(null, arguments);
  41. complete.apply(null, arguments);
  42. };
  43. // 失败回调
  44. var callFail = function (error) {
  45. fail.call(null, error);
  46. complete.call(null, error);
  47. };
  48. // 是否已经进行过重试
  49. var hasRetried = false;
  50. if (requireLogin) {
  51. doRequestWithLogin();
  52. } else {
  53. doRequest();
  54. }
  55. // 登录后再请求
  56. function doRequestWithLogin() {
  57. loginLib.login({ success: doRequest, fail: callFail });
  58. }
  59. // 实际进行请求的方法
  60. function doRequest() {
  61. var authHeader = buildAuthHeader(Session.get());
  62. wx.request(utils.extend({}, options, {
  63. header: utils.extend({}, originHeader, authHeader),
  64. success: function (response) {
  65. console.log(response);
  66. var data = response.data;
  67. // 如果响应的数据里面包含 SDK Magic ID,表示被服务端 SDK 处理过,此时一定包含登录态失败的信息
  68. if (data && data[constants.WX_SESSION_MAGIC_ID]) {
  69. // 清除登录态
  70. Session.clear();
  71. var error, message;
  72. if (data.error === constants.ERR_INVALID_SESSION||data.error === constants.ERR_CHECK_LOGIN_FAILED) {
  73. console.log('123');
  74. // 如果是登录态无效,并且还没重试过,会尝试登录后刷新凭据重新请求
  75. if (!hasRetried) {
  76. hasRetried = true;
  77. doRequestWithLogin();
  78. return;
  79. }
  80. message = '登录态已过期';
  81. error = new RequestError(data.error, message);
  82. } else {
  83. message = '鉴权服务器检查登录态发生错误(' + (data.error || 'OTHER') + '):' + (data.message || '未知错误');
  84. error = new RequestError(constants.ERR_CHECK_LOGIN_FAILED, message);
  85. }
  86. callFail(error);
  87. return;
  88. }
  89. callSuccess.apply(null, arguments);
  90. },
  91. fail: callFail,
  92. complete: noop,
  93. }));
  94. };
  95. };
  96. module.exports = {
  97. RequestError: RequestError,
  98. request: request,
  99. };