Javascript Unabel从本地服务器获取json文件
我想用Koa编写一个服务器API,该服务器提供一个API端点/API/data。当用户在浏览器中输入localhost:3000/api/data时,服务器从本地读取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
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'
是完美的。非常感谢。非常感谢,你帮了我很多:)