koa-router 回调中ctx.body返回无效
发布于 6 年前 作者 WangSiTu 3547 次浏览 来自 问答

这样写在回调里就ctx.body就没有了,直接在外面有返回

const {BosClient, MimeType} = require('bce-sdk-js')
const fs = require('fs')
const path = require('path')

function upload(ctx) {
  const uploadFilePath = ctx.request.body.path;
  const file = ctx.request.files.file;

  // 创建可读流
  const reader = fs.createReadStream(file.path);
  let filePath = path.join('static/upload/') + `${file.name}`;
  // 创建可写流
  const upStream = fs.createWriteStream(filePath);
  // 可读流通过管道写入可写流
  reader.pipe(upStream);

  const bucket = 'tp-statics';
  const endpoint = 'xxx';
  const config = {
    endpoint, //传入Bucket所在区域域名
    credentials: {
      ak: 'xxx', // 您的AccessKey
      sk: 'xxx' // 您的SecretAccessKey
    }
  };

  const client = new BosClient(config);
  // 上传路径+文件名
  const key = uploadFilePath + file.name;
  const ext = key.split(/\./g).pop();
  // 检查类型
  let mimeType = MimeType.guess(ext);
  if (/^text\//.test(mimeType)) mimeType += '; charset=UTF-8';
  const options = {
    'Content-Type': mimeType
  };


  reader.on("close", () => {
    //   console.log("流关闭了~~~");
    client.putObjectFromFile(bucket, key, filePath, options).then(res => {
      ctx.body = {
        code: 200,
        data: {
          domain: 'https://xxx',
          key,
          url: `https://xxx/${key}`
        },
        message: '上传成功'
      }
    }).catch(err => {
      ctx.body = {
        code: 500,
        message: err
      }
    })
  });
}
4 回复

ctx.request.body

来自实用的 CNodeJS-Swift

@tomoya92 不是用ctx.request.body呀,没有效果的

@WangSiTu 不好意思,我看错了,理解成获取请求数据了

回调里最好不要写ctx.body 返回,如果有异常,可以抛出,然后配置一个全局异常处理的中间件

如下:

await ctx.throw(500, error.message)

统一处理异常:

const error = require('koa-error');
// error handler
app.use(error({
  engine: 'nunjucks',
  template: viewsdir + '/error.njk'
}))

处理过程中如果有异步,或者回调的地方,都改成 async/await 来处理

回调异步的,你在回调函数里面处理ctx.body,koa在运行的时候是不会轮到回调函数内的ctx.body语句运行的,早早就先返回了。

回到顶部