tl-uniapp
Version:
自主开发的UniApp组件——Жидзин(triangulum-ui)系列组件库。用于组件
105 lines (94 loc) • 4.73 kB
JavaScript
/** x-request-config V1.0 自动请求接口信息的动作 20230215 by Sieyoo, 赵向明 */
// import XTakeAt from './x-take-at.js';
const XRequestUploadUniapp = function () {};
/**
* function format 对Date的扩展,将 Date 转化为指定格式的String
* @param {object} config 请求配置。可用的属性有:{url, method, root, headers, nodeData, nodeStatus, nodeStatusValue}
* @param {object} param 请求接口中需要附带上的参数
* @desc 符号定义
* @return {Promise} 请求接口的返回信息
* @example 例子:
* config = {
* url: '/api/enroll_edit/{{id}}',
* method: 'PUT',
* root: 'http://www.xxx.com',
* headers: { Authorization: localStorage.getItem('token') },
* nodeStatus: 'err',
* nodeStatusValue: 0,
* };
*/
XRequestUploadUniapp.request = function (config, localUrl, param = {}, progressCallback) {
// console.log('XRequestUploadUniapp:', config, localUrl, param);
if (!config || !config.url) {
console.warn('【您尚未配置上传地址】', this.config);
}
const url = (/^https?/.test(config.rootUrl) ? config.rootUrl : '') + (config.url || '');
let method = (config.method || 'GET').toUpperCase();
let headers = {};
// 是否需要令牌,仅支持Bearer
if (config.needToken === true) {
const token = uni.getStorageSync(config.tokenKey || 'token');
token && (headers['Authorization'] = token); // 'Bearer '+
}
headers = {
...headers,
...config.headers,
};
// console.log("XRequestActionUniapp111:", headers, param);
const configParams = config.param && Object.prototype.toString.call(config.param).slice(8, -1) === 'Object' ? config.param : {};
const params = Object.assign({}, configParams, param);
let newParam = {};
// 过滤掉空信息,有BUG
for (const key in params) {
if (!['', undefined, null].includes(param[key])) {
newParam[key] = params[key];
}
}
return new Promise((resolve, reject) => {
const uploadTask = uni.uploadFile({
url: url, // 上传的接口地址
filePath: localUrl,
fileType: 'image/video/audio', // 仅支付宝小程序,且必填。
name: config.name || 'image',
timeout: (config.timeout || 1200) * 1000, // 超时时间,单位 ms
header: headers || {},
formData: newParam || {},
success: res => {
// console.log('XRequestUploadUniapp: res:', res);
if (res.statusCode !== 200) {
reject(res.data, res);
return;
}
const result = typeof res.data === 'object' ? res.data : JSON.parse(res.data); // 在Uniapp小程序中,其返回的是JSON序列化字符串。// 本不应存在的边界,什么情况下会出这个???返回了JSON字符串,哪个二货后端搞的鬼?答:原来是Uni-App那那人。
// console.log("XRequestUploadUniapp: fileInfo:", result)
if (result[config.nodeStatus || 'err'] !== (config.nodeStatusValue || 0)) {
// this.$message({ message: result && result.msg, type: 'warning' });
console.warn('服务器连接正确,但返回接口或参数错误:', result.msg ? result.msg : res);
reject(result, res);
return;
}
console.log('requestAction: nodeData:', config.nodeData);
if (config.nodeData === undefined) {
config.nodeData = 'data';
}
// 传统的节点获取写法,不依赖外部工具函数
const tt = config.nodeData.split('.');
const data = tt.length === 1 && tt[0] ? result[config.nodeData] : tt.length === 2 && result && result[tt[0]] && result[tt[0]][tt[1]] ? result[tt[0]][tt[1]] : result;
// const data = XTakeAt.getValue(result, config.nodeData, result)
console.log('XRequestUploadUniapp data:', config.nodeData, data);
resolve(data);
},
fail: err => {
console.warn('网络地址没有响应或请求失败 config:', config, err);
reject(err.data, err);
},
});
if (progressCallback) {
uploadTask.onProgressUpdate(progress => {
// console.log('uploadTask', progress);
progressCallback(progress);
});
}
});
};
export default XRequestUploadUniapp;