2015-09-22 154 views
5

我是koa.js库的新手,需要一些帮助。我正在尝试使用koa制作简单的REST应用程序。 我有一个静态的html和javascript文件,我想在路由/上提供服务,而REST API从/api/上访问。Koa.js - 提供静态文件和REST API

这是我的项目目录树:

project 
├── server 
│   ├── node_modules 
│   ├── package.json 
│   └── src 
│    ├── config 
│    ├── resources 
│    └── server.js 
├── ui 
│   ├── app 
│   ├── bower.json 
│   ├── bower_components 
│   ├── dist 
│   ├── node_modules 
│   ├── package.json 
│   └── test 

这是我的源:

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 

我试过koa-statickoa-static-folderkoa-static-server库既不工作,所以我做错了什么。

我已经试过这和它的作品,但我没有我的REST API的访问:

var app = require('koa')(); 
app.use(require('koa-static')('../ui/app/', {})); 
+0

我的回答是否有意义,你还有其他问题吗? –

+0

我忘了哟upvote你的答案。差不多一年之后,谢谢:) – suricactus

回答

9

这是一个有点硬,我跟着你在你的示例代码在做什么。 .. 下面是一个简单的例子,做一切你想:

'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); 
+0

'this.body ='hi'get'中指针'this'是什么? '? – Believe2014

+0

我一直在为koa v2摔跤,也许你可以提供一些见解? 'app.use(异步(CTX,下一个)=> { 等待发送(CTX,path.join(__目录名称, '../', '客户端/ index.html中')) })' 我得到一个404找不到错误,因为某些原因...虽然有点黑客,我可以提供单独的html文件,如果它不是文件夹,我无法加载我的图像等。 – hoodsy

+0

@hoodsy你有没有想出答案?我尝试了app.use(async(ctx,next)...并且无法让它工作。尝试了各种不同的变体,但似乎没有任何工作。 – Nurpax

1

从@Nurpax的评论:

app.use(async function (ctx, next) { 
    return send(ctx, '/index.html', { root: paths.client() 
}) 
.then(() => next()) }) 

关键是要指定{root:<some path>}。我认为在我的情况下,问题是出于安全原因,发送不允许项目树之外的相对路径或路径。指定根参数,然后给出一个与此相关的文件名似乎可以解决问题。我猜想我希望koa-send在节点输出上记录关于此的错误/警告。

+1

不知道为什么你在代码中承诺。只要使用等待:) app.use(异步(CTX)=> { 等待发送(CTX, '/index.html',{ 根:STATIC_FOLDER_PATH, }); }); –