取消从本地服务器获取json文件

时间:2017-11-22 17:30:21

标签: javascript json api koa

我想用 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,请帮助我!

2 个答案:

答案 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('.'));