hera-cli
Version:
Hera Project Creator
131 lines (106 loc) • 3.34 kB
JavaScript
var constants = require('./constants')
var utils = require('./utils')
var Session = require('./session')
var loginLib = require('./login')
var noop = function noop () {}
var buildAuthHeader = function buildAuthHeader (session) {
var header = {}
if (session && session.id && session.skey) {
header[constants.WX_HEADER_ID] = session.id
header[constants.WX_HEADER_SKEY] = session.skey
}
return header
}
/***
* @class
* 表示请求过程中发生的异常
*/
var RequestError = (function () {
function RequestError (type, message) {
Error.call(this, message)
this.type = type
this.message = message
}
RequestError.prototype = new Error()
RequestError.prototype.constructor = RequestError
return RequestError
})()
function request (options) {
if (typeof options !== 'object') {
var message = '请求传参应为 object 类型,但实际传了 ' + typeof options + ' 类型'
throw new RequestError(constants.ERR_INVALID_PARAMS, message)
}
var requireLogin = options.login
var success = options.success || noop
var fail = options.fail || noop
var complete = options.complete || noop
var originHeader = options.header || {}
// 成功回调
var callSuccess = function () {
success.apply(null, arguments)
complete.apply(null, arguments)
}
// 失败回调
var callFail = function (error) {
fail.call(null, error)
complete.call(null, error)
}
// 是否已经进行过重试
var hasRetried = false
if (requireLogin) {
doRequestWithLogin()
} else {
doRequest()
}
// 登录后再请求
function doRequestWithLogin () {
loginLib.login({ success: doRequest, fail: callFail })
}
// 实际进行请求的方法
function doRequest () {
var authHeader = buildAuthHeader(Session.get())
wx.request(
utils.extend({}, options, {
header: utils.extend({}, originHeader, authHeader),
success: function (response) {
var data = response.data
// 如果响应的数据里面包含 SDK Magic ID,表示被服务端 SDK 处理过,此时一定包含登录态失败的信息
if (data && data[constants.WX_SESSION_MAGIC_ID]) {
// 清除登录态
Session.clear()
var error, message
if (data.error === constants.ERR_INVALID_SESSION) {
// 如果是登录态无效,并且还没重试过,会尝试登录后刷新凭据重新请求
if (!hasRetried) {
hasRetried = true
doRequestWithLogin()
return
}
message = '登录态已过期'
error = new RequestError(data.error, message)
} else {
message =
'鉴权服务器检查登录态发生错误(' +
(data.error || 'OTHER') +
'):' +
(data.message || '未知错误')
error = new RequestError(
constants.ERR_CHECK_LOGIN_FAILED,
message
)
}
callFail(error)
return
}
callSuccess.apply(null, arguments)
},
fail: callFail,
complete: noop
})
)
}
}
module.exports = {
RequestError: RequestError,
request: request
}