node 做 中间层 导出下载接口传参
导出下载接口传参 是 需要qs 序列化的
qs是一个npm仓库所管理的包,可通过npm install qs
命令进行安装.
1. qs.parse()将URL解析成对象的形式
2. qs.stringify()将对象 序列化成URL的形式,以&进行拼接
qs.parse qs.stringify是用来处理url的,JSON.parse JSON.stringify是处理json的
项目中 为
qs: ctx.request.query || {},
node 代码
routerModular.get('/alarmManagement/alarmManageExport', async (ctx, next) => { let url = SERVER_BASE_URI + '/alarm/export'; let option = { url: url, // 接口 method: 'get', headers: { accessToken: ctx.headers.accesstoken || '', ssoId: ctx.headers.ssoid || '' }, qs: ctx.request.query || {}, // 参数序列化 }; ctx.body = await request(option).on('response', function (response) { if (response.statusCode === 200) { if (response.headers['content-disposition']) { ctx.set('Content-disposition', response.headers['content-disposition']) } ctx.set('content-type', response.headers['content-type']) } }) });
react 项目中 的接口文件 导出接口 要加
responseType: 'blob',
export async function getExport(payload) { return await request({ url: '/nodeapi//alarmExport', responseType: 'blob', method: 'get', params: payload, }); }
model文件
effects:(dispatch) => ({ // 导出 async getExport(payload) { let response = await service.getExport({ ...payload }); return response; }, }),
调用接口 + 文件下载
dispatchers.getExport(params).then((res) => { // res文件流 使用 Blob 创建一个指向类型化数组 let blob = new Blob([res], { type: `application/vnd.ms-excel;charset=utf-8`, }); // 获取heads中的filename文件名 let downloadElement = document.createElement('a'); // 创建下载的链接 let href = window.URL.createObjectURL(blob); downloadElement.href = href; // 下载后文件名 downloadElement.download = `${name}_${moment().format( 'YYYYMMDDHHmm' )}.xlsx`; document.body.appendChild(downloadElement); // 点击下载 downloadElement.click(); // 下载完成移除元素 document.body.removeChild(downloadElement); // 释放掉blob对象 window.URL.revokeObjectURL(href); });