normalize.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. const {
  2. UniCloudError
  3. } = require('../../../common/error')
  4. const {
  5. camel2snakeJson,
  6. snake2camelJson
  7. } = require('../../../common/utils')
  8. function generateApiResult (apiName, data) {
  9. if (data.ret || data.error) {
  10. // 这三种都是qq的错误码规范
  11. const code = data.ret || data.error || data.errcode || -2
  12. const message = data.msg || data.error_description || data.errmsg || `${apiName} fail`
  13. throw new UniCloudError({
  14. code,
  15. message
  16. })
  17. } else {
  18. delete data.ret
  19. delete data.msg
  20. delete data.error
  21. delete data.error_description
  22. delete data.errcode
  23. delete data.errmsg
  24. return {
  25. ...data,
  26. errMsg: `${apiName} ok`,
  27. errCode: 0
  28. }
  29. }
  30. }
  31. function nomalizeError (apiName, error) {
  32. throw new UniCloudError({
  33. code: error.code || -2,
  34. message: error.message || `${apiName} fail`
  35. })
  36. }
  37. async function callQQOpenApi ({
  38. name,
  39. url,
  40. data,
  41. options,
  42. defaultOptions
  43. }) {
  44. options = Object.assign({}, defaultOptions, options, { data: camel2snakeJson(Object.assign({}, data)) })
  45. let result
  46. try {
  47. result = await uniCloud.httpclient.request(url, options)
  48. } catch (e) {
  49. return nomalizeError(name, e)
  50. }
  51. let resData = result.data
  52. const contentType = result.headers['content-type']
  53. if (
  54. Buffer.isBuffer(resData) &&
  55. (contentType.indexOf('text/plain') === 0 ||
  56. contentType.indexOf('application/json') === 0)
  57. ) {
  58. try {
  59. resData = JSON.parse(resData.toString())
  60. } catch (e) {
  61. resData = resData.toString()
  62. }
  63. } else if (Buffer.isBuffer(resData)) {
  64. resData = {
  65. buffer: resData,
  66. contentType
  67. }
  68. }
  69. return snake2camelJson(
  70. generateApiResult(
  71. name,
  72. resData || {
  73. errCode: -2,
  74. errMsg: 'Request failed'
  75. }
  76. )
  77. )
  78. }
  79. module.exports = {
  80. callQQOpenApi
  81. }