UNPKG

nsn-service

Version:

NSN服务组件

326 lines (252 loc) 11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.httpErrorHandler = exports.request = void 0; var _antd = require("antd"); var _nsnConst = require("nsn-const"); var _nsnEnum = require("nsn-enum"); var _nsnUtil = require("nsn-util"); var _umiRequest = require("umi-request"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } var getHashCode = function getHashCode(url) { var chars = url.split(''); var hash = 0; chars.forEach(function (c) { var character = c.charCodeAt(0); hash = (hash << 5) - hash + character; hash |= 0; }); return hash; }; /** * // 文件名(后端下载时,在响应头中设置了该文件头 Content-Disposition) * @param response 响应体 */ var getFileNameFromHeader = function getFileNameFromHeader(response) { var filename = "".concat(new Date().getTime()); response.headers.forEach(function (value, key) { if (_nsnUtil.NStr.isEqual(key.toLocaleLowerCase(), 'content-disposition')) { filename = window.decodeURI(value); } }); var ZH_CN_STR = 'zh_cn'; if (filename && filename.includes(ZH_CN_STR)) { filename = filename.substring(filename.indexOf(ZH_CN_STR) + ZH_CN_STR.length + 1); } return filename; }; /** 非 200 响应处理 */ var httpErrorHandler = function httpErrorHandler(error) { _antd.notification.destroy(); var response = error.response; if (response && response.status) { var status = response.status, url = response.url; // 请求已发送但服务端返回状态码非 2xx 的响应 var errorText = _nsnUtil.NLocale.getText("http.status.".concat(status)) || response.statusText; _antd.notification.error({ message: "".concat(_nsnUtil.NLocale.getText('http.request-error'), " ").concat(status), description: "".concat(errorText, ", ").concat(url), duration: 0 }); } else if (!response) { // 请求初始化时出错或者没有响应返回的异常 _antd.notification.error({ message: _nsnUtil.NLocale.getText('http.network-error.title'), description: _nsnUtil.NLocale.getText('http.network-error.description'), duration: 0 }); } }; /** 非 正常 业务响应处理 */ exports.httpErrorHandler = httpErrorHandler; var nsnErrorHandler = function nsnErrorHandler(rs) { _antd.notification.destroy(); var response = rs.response, data = rs.data; _antd.notification.error({ message: _nsnUtil.NLocale.getMsg(data), description: "".concat(response.url, ". ").concat(data.errors ? "stack= ".concat(data.errors) : _nsnConst.NConst.EMPTY), duration: 0 }); }; /** 自定义抛出异常 处理 */ var customErrorHandler = function customErrorHandler(e) { _antd.notification.error({ message: e.name, description: "".concat(e.message, ". stack= ").concat(e.stack), duration: 0 }); }; /** 请求头参数 */ var getHeaders = function getHeaders(url, ignoreToken) { var headers = { Accept: 'application/json' }; headers[_nsnConst.NConst.HEADER_TOKEN] = _nsnUtil.NToken.get(); if (ignoreToken === true) { headers[_nsnConst.NConst.HEADER_TOKEN] = getHashCode(url); } if (_nsnUtil.NUser.isMultiRoleMode()) { headers[_nsnConst.NConst.HEADER_ROLE_ID] = _nsnUtil.NStr.blankToEmpty(_nsnUtil.NUser.getRoleId()); } if (_nsnUtil.NUser.isAdminSuper() && _nsnUtil.NUser.isMultiTenantMode()) { headers[_nsnConst.NConst.HEADER_TENANT_ID] = _nsnUtil.NStr.blankToEmpty(_nsnUtil.NUser.getTenantId()); } return headers; }; /** 配置request请求时的默认参数 */ var requestExtend = (0, _umiRequest.extend)({ // 发送包含凭据的请求(即使是跨域源) credentials: 'include', // 获取response源,既返回blob,又返回response getResponse: true, // 统一错误处理 errorHandler: httpErrorHandler }); /** 全局中间件,添加请求前后处理 */ requestExtend.use( /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(ctx, next) { var req, url, options, headers, ignoreToken, token, res, rs, _rs$data, data, code, skipAlert, lang; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: req = ctx.req; url = req.url, options = req.options; headers = options.headers; ignoreToken = false; if (headers) { token = headers[_nsnConst.NConst.HEADER_TOKEN]; if (_nsnUtil.NStr.isEqual(token, getHashCode(url))) { ignoreToken = true; } } // 若不忽略token检查 if (ignoreToken) { _context.next = 8; break; } if (!(!_nsnUtil.NUrl.isIgnoreUrl(url) && _nsnUtil.NToken.isExpired())) { _context.next = 8; break; } return _context.abrupt("return"); case 8: _context.next = 10; return next(); case 10: // 请求后,返回前(在请求前获取 res 会导致请求失败) res = ctx.res; if (res) { rs = res; _rs$data = rs.data, data = _rs$data === void 0 ? {} : _rs$data; code = data.code; // 业务异常检查 skipAlert = _nsnUtil.NStore.get(url); if (!_nsnUtil.NStr.isEqual(code, _nsnEnum.ResponseCode.SUCCESS)) { if (!skipAlert && !_nsnUtil.NUrl.isBlobUrl(url)) { nsnErrorHandler(res); } if (_nsnUtil.NStr.isEqual(code, _nsnEnum.ResponseCode.EXPIRED)) { // 清空 store lang = _nsnUtil.NLocale.get(); _nsnUtil.NStore.clear(); if (lang) { _nsnUtil.NLocale.set(lang); } } } } case 12: case "end": return _context.stop(); } } }, _callee); })); return function (_x, _x2) { return _ref.apply(this, arguments); }; }(), { global: true }); /** http请求。默认 GET 请求 */ var request = /*#__PURE__*/function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(params) { var ctx, uri, options, skipAlert, nonPrefix, ignoreToken, url, defaultData, resultData, headers, result, rs, data, response; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: ctx = params.ctx, uri = params.uri, options = params.options, skipAlert = params.skipAlert, nonPrefix = params.nonPrefix, ignoreToken = params.ignoreToken; url = _nsnUtil.NUrl.getUrl(ctx, uri, nonPrefix); if (skipAlert) { _nsnUtil.NStore.set(_defineProperty({}, url, skipAlert)); } defaultData = { code: _nsnEnum.ResponseCode.REQUEST_ERROR, errors: _nsnUtil.NLocale.getText('http.no-response') }; resultData = Promise.resolve(defaultData); // 请求头 eg: {'Content-Type': 'multipart/form-data'} // FormData 封装的数据,浏览器自动会添加该文件头,不用自定义设置 headers = getHeaders(url, ignoreToken); result = requestExtend(url, _objectSpread({ headers: headers }, options)); _context2.next = 9; return result; case 9: rs = _context2.sent; if (!rs) { _context2.next = 19; break; } data = rs.data, response = rs.response; if (!response) { _context2.next = 17; break; } if (!_nsnUtil.NUrl.isBlobUrl(url)) { _context2.next = 15; break; } return _context2.abrupt("return", response.blob().then(function (blob) { if (blob) { // 创建 var objectURL = URL.createObjectURL(blob); var btn = document.createElement('a'); btn.download = getFileNameFromHeader(response); btn.href = objectURL; btn.click(); // 释放 URL.revokeObjectURL(objectURL); btn = null; } })); case 15: if (!(response.status === 204)) { _context2.next = 17; break; } return _context2.abrupt("return", response.text()); case 17: if (!data || !response) { customErrorHandler(new Error(defaultData.errors)); } return _context2.abrupt("return", data || resultData); case 19: return _context2.abrupt("return", resultData); case 20: case "end": return _context2.stop(); } } }, _callee2); })); return function request(_x3) { return _ref2.apply(this, arguments); }; }(); exports.request = request;