Egg 实现上传接口

724 阅读1分钟

前端客户端

  • 需要依赖包axios,npm i axios --save
  • nodeJs只做前端接口代理,请求函数中的params对象api属性为真正的后端接口
/**
 * 封装前端请求函数
 */
const upload = async (data) => {
    const response = await axios
      .post('/upload', data, {
        maxContentLength: 1024 * 10,
        params: {
          api: '/api/upload',
        },
        headers: {
          'Content-Type': 'multipart/form-data',
        },
        withCredentials: true,
      })
      .then((res) => res.data)
      .catch((err) => {
        showErrorMessage(err);
      });
	
    // 通用的判断请求是否成功的函数
    if (isSuccess(response)) {
      return response.data;
    } else {
      message.error(`上传操作异常: ${response.error_desc}`);
      return null;
    }
  }
	const handleOkUpload = async (file) => {
      const formData = new FormData();
      formData.append('file', file); // file为要上传的文件数据流

      // 调用上传ajax函数
      const resData = await upload(formData);
      
      if(resData){
      	// do somesing
      }
    }
	

NodeJs端

  • 需要依赖包request-promise,npm i request-promise --save

config/config.default.js添加配置

  config.multipart = {
    mode: 'file',
    fileSize: '10mb',
    fileExtensions: ['.xlsx', '.xls'],
  };
  

app/controller/upload.js 上传接口

const { Controller } = require('egg');
const rp = require('request-promise');
const fs = require('fs');
const qs = require('querystring');

/**
 * 上传接口
 */
class UploadController extends Controller {
  async index() {
    const { ctx, config } = this;
    
    // 从配置文件中读取不同环境下的请求根域名与超时时间的配置
    const { noahApiServer, requestTimeout } = config;
    const { apihost } = noahApiServer;
    
    const { request } = ctx;
    const { body, files, query } = request;
    const { case_id, tag_id } = body;
    const { api } = query;
    const file = files[0];
    const { filepath, filename } = file;

    const url = `${apihost}${api}`;
  
    const requestURI = `${url}?${qs.stringify(query)}`;

    try {
      ctx.logger.info('上传接口:', requestURI);
      ctx.logger.info('上传接口body参数:', body);
      const result = await rp({
        uri: requestURI,
        method: 'POST',
        formData: {
          case_id,
          tag_id,
          file: {
            value: fs.createReadStream(filepath),
            options: {
              filename,
              contentType: ctx.get('content-type'),
            },
          },
        },
        json: true,
        timeout: requestTimeout,
      });
      ctx.body = result;
    } catch (err) {
      ctx.logger.info('Excel上传失败:', err.message);
      ctx.body = {
        cost: 1001,
        error_desc: `server error: ${err.message}`,
        result_code: 'FAIL',
        time: Date.now(),
      };
    }
  }
}

module.exports = UploadController;

app/router.js 接口挂载

module.exports = (app) => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
  router.post('/upload', controller.upload.index);
};