Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Unabel从本地服务器获取json文件_Javascript_Json_Api_Koa - Fatal编程技术网

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

Javascript Unabel从本地服务器获取json文件,javascript,json,api,koa,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 = requi

我想用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,我不知道哪里出了问题。我刚开始学膝关节炎,请帮帮我! 您可以流式传输该文件。这可能更容易:

router.get('/api/data', async (ctx, next) => {
  var readStream = fs.createReadStream('./data.json','utf8');
  ctx.body = readStream;
  await next();
});
使用
ctx.body
来推出数据,而不是
wait fs.readFile()
,后者只是返回到无处

更新

我想你应该删除
app.use(service('.')并将此中间件放在路由器中间件之后:

app
  .use(router.routes())
  .use(router.allowedMethods())
  .use(serve('.'));

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);
})

您应该检查您试图读取的文件是否位于您提供的路径上。
fs.readFile('./data.json'
data.json文件位于该路径上,您不需要等待下一步()
如果您返回当前中间件中的响应主体,当中间件链结束并且
ctx.body
仍然为空时,会显示404错误。哦,我的错误!我们不需要
等待下一步()
。但是仍然需要ctx.body来输出响应。我已经更新了我的答案。谢谢。需要添加到
ctx.response.body='application/json'
是完美的。非常感谢。非常感谢,你帮了我很多:)