我想用 Koa 编写服务器API,此服务器提供单个API端点 / api / data 。当用户在浏览器中输入 localhost:3000 / api / data 时,服务器从本地读取 json 文件并在浏览器中显示。
const Koa = require('koa');
const serve = require('koa-static');
const Router = require('koa-router');
// const http = require('http');
const fs = require('fs');
const app = new Koa();
const router = new Router();
app.use(serve('.'));
router.get('/api/data', async (ctx, next) => {
await fs.readFile('./data.json','utf-8', (err, data) => {
ctx.body = JSON.parse(data);
});
});
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000);
它不起作用。错误信息是404,我不知道出了什么问题。我刚开始学习Koa,请帮助我!
答案 0 :(得分:0)
fs.readFile
没有返回承诺,这就是为什么koa
不会等到它完成的原因,并且一旦它到达中间件函数的末尾,如果正文仍为空将返回404页面。
因此,您需要宣传所有异步功能,或使用其同步版本。
您的中间件应如下所示:
router.get('/api/data', async (ctx) => {
// utf8 is required, without it fs.readFileSync will return you a buffer
let data = fs.readFileSync('./data.json', 'utf8')
ctx.body = JSON.parse(data);
})
答案 1 :(得分:-1)
您可以流式传输该文件。它可能更容易:
router.get('/api/data', async (ctx, next) => {
var readStream = fs.createReadStream('./data.json','utf8');
ctx.body = readStream;
await next();
});
使用ctx.body
来推送数据,而不是await fs.readFile()
,而这只是无处可回。
<强>更新强>
我想你应该删除app.use(serve('.'));
并将此中间件置于路由器中间件之后:
app
.use(router.routes())
.use(router.allowedMethods())
.use(serve('.'));