koa-router 回调中ctx.body返回无效
这样写在回调里就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语句运行的,早早就先返回了。