const {
|
UniCloudError
|
} = require('../../../common/error')
|
const {
|
camel2snakeJson, snake2camelJson
|
} = require('../../../common/utils')
|
|
function generateApiResult (apiName, data) {
|
if (data.errcode) {
|
throw new UniCloudError({
|
code: data.errcode || -2,
|
message: data.errmsg || `${apiName} fail`
|
})
|
} else {
|
delete data.errcode
|
delete data.errmsg
|
return {
|
...data,
|
errMsg: `${apiName} ok`,
|
errCode: 0
|
}
|
}
|
}
|
|
function nomalizeError (apiName, error) {
|
throw new UniCloudError({
|
code: error.code || -2,
|
message: error.message || `${apiName} fail`
|
})
|
}
|
|
// 微信openapi接口接收蛇形(snake case)参数返回蛇形参数,这里进行转化,如果是formdata里面的参数需要在对应api实现时就转为蛇形
|
async function callWxOpenApi ({
|
name,
|
url,
|
data,
|
options,
|
defaultOptions
|
}) {
|
let result = {}
|
// 获取二维码的接口wxacode.get和wxacode.getUnlimited不可以传入access_token(可能有其他接口也不可以),否则会返回data format error
|
const dataCopy = camel2snakeJson(Object.assign({}, data))
|
if (dataCopy && dataCopy.access_token) {
|
delete dataCopy.access_token
|
}
|
try {
|
options = Object.assign({}, defaultOptions, options, { data: dataCopy })
|
result = await uniCloud.httpclient.request(url, options)
|
} catch (e) {
|
return nomalizeError(name, e)
|
}
|
|
// 有几个接口成功返回buffer失败返回json,对这些接口统一成返回buffer,然后分别解析
|
let resData = result.data
|
const contentType = result.headers['content-type']
|
if (
|
Buffer.isBuffer(resData) &&
|
(contentType.indexOf('text/plain') === 0 ||
|
contentType.indexOf('application/json') === 0)
|
) {
|
try {
|
resData = JSON.parse(resData.toString())
|
} catch (e) {
|
resData = resData.toString()
|
}
|
} else if (Buffer.isBuffer(resData)) {
|
resData = {
|
buffer: resData,
|
contentType
|
}
|
}
|
return snake2camelJson(
|
generateApiResult(
|
name,
|
resData || {
|
errCode: -2,
|
errMsg: 'Request failed'
|
}
|
)
|
)
|
}
|
|
function buildUrl (url, data) {
|
let query = ''
|
if (data && data.accessToken) {
|
const divider = url.indexOf('?') > -1 ? '&' : '?'
|
query = `${divider}access_token=${data.accessToken}`
|
}
|
return `${url}${query}`
|
}
|
|
module.exports = {
|
callWxOpenApi,
|
buildUrl
|
}
|