2015-09-22 153 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, }); }); –