pvmed-server-libs
Version: 
pvmed server libs
119 lines (116 loc) • 2.87 kB
JavaScript
const request = require('request-promise')
const BaseError = require('../exceptions/base_error')
const HttpStatusCode = require('../constants/http_status_code')
class RemoteAPIError extends BaseError {
  constructor(name, code, msg) {
    super(code, `远程调用${name}出现错误:${msg}`)
  }
}
class RemoteAPI {
  constructor(name, baseUrl, globalOpts = {}) {
    this.name = name
    this.baseUrl = baseUrl
    this.globalOpts = globalOpts
    this.request = request.defaults(this.globalOpts)
  }
  setGlobalOpts(globalOpts = {}) {
    this.request = request.defaults(globalOpts)
  }
  async handleResponse(resp) {
    try {
      if (resp.code == 200) {
        return resp.data
      } else {
        throw new RemoteAPIError(this.name, resp.code, resp.message)
      }
    } catch (e) {
      if (e instanceof RemoteAPIError) {
        throw e
      } else {
        throw new RemoteAPIError(this.name, HttpStatusCode.HTTP_INTERNAL_SERVER_ERROR, e.message)
      }
    }
  }
  async postForm(path, formData = {}, opts = { filter: true }) {
    const resp = await this.request.post({
      baseUrl: this.baseUrl,
      uri: path,
      formData: formData,
      json: true,
      ...opts
    })
    if (opts.filter === true) {
      return this.handleResponse(resp)
    }
    return resp
  }
  async putForm(path, formData = {}, opts = { filter: true }) {
    const resp = await this.request.put({
      baseUrl: this.baseUrl,
      uri: path,
      formData: formData,
      json: true,
      ...opts
    })
    if (opts.filter === true) {
      return this.handleResponse(resp)
    }
    return resp
  }
  async postJson(path, json = {}, opts = { filter: true }) {
    const resp = await this.request.post({
      baseUrl: this.baseUrl,
      uri: path,
      body: json,
      json: true,
      ...opts
    })
    if (opts.filter === true) {
      return this.handleResponse(resp)
    }
    return resp
  }
  async putJson(path, json = {}, opts = { filter: true }) {
    const resp = await this.request.put({
      baseUrl: this.baseUrl,
      uri: path,
      body: json,
      json: true,
      ...opts
    })
    if (opts.filter === true) {
      return this.handleResponse(resp)
    }
    return resp
  }
  async delete(path, qs = {}, opts = { filter: true }) {
    const resp = await this.request.delete({
      baseUrl: this.baseUrl,
      uri: path,
      qs: qs,
      json: true,
      ...opts
    })
    if (opts.filter === true) {
      return this.handleResponse(resp)
    }
    return resp
  }
  async get(path, qs = {}, opts = { filter: true }) {
    const resp = await this.request.get({
      baseUrl: this.baseUrl,
      uri: path,
      qs: qs,
      json: true,
      ...opts
    })
    if (opts.filter === true) {
      return this.handleResponse(resp)
    }
    return resp
  }
}
module.exports = {
  RemoteAPIError,
  RemoteAPI
}