场景
-
在使用koa2编写接口时,在中间件中使用了fs.readFile函数,在它的回调中进行了ctx的返回设置,但是前端获取该接口返回却是404(已确定接口逻辑没有错误且正确执行了)
-
代码:
- 复制代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27router.get('/:folder/:date/:file', async ctx => { const { folder, date, file } = ctx.params; const path = `static/${folder}/${date}/${file}`; await fs.readFile(path,function(err,data) => { if(err) { ctx.status = 404; ctx.body = { data: { msg: '文件不存在' }, code: 404 }; } else { console.log(111); // 打印调试 ctx.status = 200; console.log(ctx.status); // 打印调试 ctx.body = { data: { article: data.toString(), msg: '查询成功' }, code: 200 }; } }) });
-
描述:请求接口后,上述程序的打印结果是111和404
-
思考:上网查询别人返回404的问题基本都是中间件含异步操作但没有使用async/await处理,与我的问题无关
-
解决:
-
方法一:将fs.readFile改为同步读取fs.readFileSync
- 复制代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22const data = fs.readFileSync(path) if(!data) { console.log(111); // 打印调试 ctx.status = 200; console.log(ctx.status); // 打印调试 ctx.body = { data: { article: data.toString(), msg: '查询成功' }, code: 200 }; } else { ctx.status = 404; ctx.body = { data: { msg: '文件不存在' }, code: 404 }; }
-
方法二:用Promise封装fs.readFile函数
- 复制代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32// 封装 function pReadFile (path) { return new Promise(function (resolve, reject) { fs.readFile(path, function (err, data) { if (err) { reject(err); } else { resolve(data); } }); }); } // 使用 await pReadFile(path).then(data => { ctx.status = 200; ctx.body = { data: { article: data.toString(), msg: '查询成功' }, code: 200 }; }).catch(err => { ctx.status = 404; ctx.body = { data: { msg: '文件不存在' }, code: 404 }; });
-
总结:查询资料发现koa的中间件对异步操作好像是返回一个Promise对象处理的,而原生的fs.readFile并不返回一个Promise对象,将其用Promise封装后就可正常运行
-
最后
以上就是尊敬手机最近收集整理的关于koa中间件异步操作使用fs.readFile正常运行后,前端收到404错误的全部内容,更多相关koa中间件异步操作使用fs内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复