const { UniCloudError } = require('../../../common/error') const { camel2snakeJson, snake2camelJson } = require('../../../common/utils') function generateApiResult (apiName, data) { if (data.ret || data.error) { // 这三种都是qq的错误码规范 const code = data.ret || data.error || data.errcode || -2 const message = data.msg || data.error_description || data.errmsg || `${apiName} fail` throw new UniCloudError({ code, message }) } else { delete data.ret delete data.msg delete data.error delete data.error_description 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` }) } async function callQQOpenApi ({ name, url, data, options, defaultOptions }) { options = Object.assign({}, defaultOptions, options, { data: camel2snakeJson(Object.assign({}, data)) }) let result try { result = await uniCloud.httpclient.request(url, options) } catch (e) { return nomalizeError(name, e) } 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' } ) ) } module.exports = { callQQOpenApi }