簡體   English   中英

Unabel從本地服務器獲取json文件

[英]Unabel to get json file from local server

我想用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,請幫助我!

fs.readFile不會返回promise,這就是為什么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);
})

您可以流式傳輸該文件。 可能會更容易:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM