首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从本地服务器获取json文件的Unabel

从本地服务器获取json文件的Unabel
EN

Stack Overflow用户
提问于 2017-11-22 17:30:21
回答 2查看 733关注 0票数 0

我想用Koa编写一个服务器API,这个服务器提供了一个API端点/api/data。当用户在浏览器中输入localhost:3000/api/data时,服务器从本地读取json文件并在浏览器中显示。

代码语言:javascript
复制
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,请帮帮我!

EN

回答 2

Stack Overflow用户

发布于 2017-11-23 09:17:01

fs.readFile不会返回承诺,这就是为什么koa不会等到它完成,并且一旦它到达中间件函数的末尾,如果主体仍然是空的,那么它将返回404页面。

因此,您需要对所有异步函数进行编程,或者使用它们的同步版本。

您的中间件应该如下所示:

代码语言:javascript
复制
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);
})
票数 0
EN

Stack Overflow用户

发布于 2017-11-23 09:16:16

你可以流那个文件。这样做可能更容易:

代码语言:javascript
复制
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('.'));并将这个中间件放在路由器中间件之后:

代码语言:javascript
复制
app
  .use(router.routes())
  .use(router.allowedMethods())
  .use(serve('.'));
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47440721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档