Koa.js - 提供静态文件和REST API

sur*_*tus 7 javascript rest static node.js koa

我是koa.js图书馆的新手,我需要一些帮助.我正在尝试使用koa制作简单的REST应用程序.我有一个静态的html和javascript文件,我想在路由/和REST API访问/api/.

这是我的项目目录树:

project
??? server
?   ??? node_modules
?   ??? package.json
?   ??? src
?       ??? config
?       ??? resources
?       ??? server.js
??? ui
?   ??? app
?   ??? bower.json
?   ??? bower_components
?   ??? dist
?   ??? node_modules
?   ??? package.json
?   ??? test
Run Code Online (Sandbox Code Playgroud)

这是我的来源:

var app = require('koa')();
app.use(mount('/api/places', require('../resources/places')));

// does not work
var staticKoa = require('koa')();
staticKoa.use(function *(next){
  yield next;
  app.use(require('koa-static')('../ui/app', {}));
});
app.use(mount('/', staticKoa));

// does not work
app.use(mount('/', function*() {
    app.use(require('koa-static')('../ui/app/', {}));
}));

// does not work
app.use(mount('/', function*() {
    app.use(require('koa-static')('.', {}));
}));
// GET package.json -> 404 not found
Run Code Online (Sandbox Code Playgroud)

我试过koa-static,koa-static-folder,koa-static-server图书馆也不工作,所以我做错了什么.

我试过这个并且它可以工作,但我无法访问我的REST API:

var app = require('koa')();
app.use(require('koa-static')('../ui/app/', {}));
Run Code Online (Sandbox Code Playgroud)

Jam*_*ore 17

我在你的示例代码中跟踪你正在做的事情有点困难......这是一个简单的例子,可以完成你想要的一切:

'use strict';
let koa     = require('koa'),
    send    = require('koa-send'),
    router  = require('koa-router')(),
    serve   = require('koa-static');

let app = koa();
// serve files in public folder (css, js etc)
app.use(serve(__dirname + '/public'));

// rest endpoints
router.get('/api/whatever', function *(){
  this.body = 'hi from get';
});
router.post('/api/whatever', function *(){
  this.body = 'hi from post'
});

app.use(router.routes());

// this last middleware catches any request that isn't handled by
// koa-static or koa-router, ie your index.html in your example
app.use(function* index() {
  yield send(this, __dirname + '/index.html');
});

app.listen(4000);
Run Code Online (Sandbox Code Playgroud)

  • @hoodsy通过反复试验,我昨晚能够正常工作:`app.use(async function(ctx,next){return send(ctx,'/ index.html',{root:paths.client() }).then(()=> next())})`关键是要指定`{root:<some path>}`.我认为我的问题是,出于安全原因,`send`不允许项目树之外的相对路径或路径.指定`root`参数然后给出相对于它的文件名似乎可以解决问题.我想我希望`koa-send`在节点输出上记录关于此的错误/警告. (2认同)
  • FWIW,我在这个 koa 与 koav2 的事情上遇到了很多问题,我正在认真考虑移植我所有的东西来表达。网络上的 koa 示例似乎分散在 koa 和 koa v2 之间,因此很难让任何示例代码工作。 (2认同)

小智 5

const root = require('path').join(__dirname, 'client', 'build');
app.use(serve(root));

app.use(async ctx => {
    await send(ctx, `/index.html`, {
        root
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 仅代码答案几乎总是可以通过添加其工作方式和原因的解释来改进。 (2认同)