2015-10-30 55 views
0

我使用Koa構建了一個小型測試服務器。它應該服務於同一目錄(和子目錄)中的所有文件,但需要使用基本身份驗證進行身份驗證。因此,我正在使用包koa-static & koa-basic auth通過koa提供靜態文件並使用基本身份驗證

我想不出如何將兩個中間件結合起來? 使用時:app.use(function *() { });預期this.body = 'text',而不是使用koa-static

這是完整的代碼:

"use strict"; 

var koa = require('koa') 
    , serve = require('koa-static') 
    , auth = require('koa-basic-auth'); 

var app = koa(); 

// Default configuration 
let port = 3000; 

app.use(function *(next){ 
    try { 
     yield next; 
    } catch (err) { 
     if (401 == err.status) { 
     this.status = 401; 
     this.set('WWW-Authenticate', 'Basic'); 
     this.body = 'Access denied'; 
     } else { 
     throw err; 
     } 
    } 
    }); 


// Require auth 
app.use(auth({ name: 'admin' , pass: 'admin'})) 

//Serve static files 
//DOESN'T WORK 
app.use(function *() { 
    serve('.') 
}); 

// WORKS 
app.use(function *(){ 
    this.body = 'secret'; 
}); 

app.listen(port); 

回答

2

您必須yield做中間件的包裝:

app.use(function *() { 
    yield serve('.') 
}); 

或直接使用中間件,而不包裝函數:

app.use(serve('.'));