用koa.js显示一个静态html文件

我想要做的是在索引路由(即localhost:3000)被调用时提供index.html文件。

我使用koa路由器进行路由,所以我的路由如下所示:

app.all("/", function * (next){ //Send the file here }); 

我试图使用koa静态像这样:

 var serve = require('koa-static'); app.all("/", function * (next){ serve("index.html"); }); 

但是这没有用。 然后我试图使用co-views(我现在把html文件放在公共目录中):

 var views = require("co-views"); var render = views("public"); app.all("/", function * (next){ this.status = 200; this.body = yield render("index.html"); }); 

但是这没有用。

那么谁能告诉我我要做什么?

那么有几种方法可以做到,这里有两个。

模板引擎

最简单的方法可能是使用像swig或jade这样的模板引擎来提供文件。

要安装它:

 npm install -s swig 

为了用共同的观点来做,就做吧

 var views = require("co-views"); var render = views("public", { map: { html: 'swig' }); app.all("/", function * (next){ this.body = yield render("index"); }); 

纯文件系统

或者,如果您不想使用模板引擎,则可以使用普通的节点文件系统库。

为了能够使用它,必须将函数包装在一个承诺中。

 var fs = require('fs'); var readFileThunk = function(src) { return new Promise(function (resolve, reject) { fs.readFile(src, {'encoding': 'utf8'}, function (err, data) { if(err) return reject(err); resolve(data); }); }); } app.use(router.get('/', function *(){ this.body = yield readFileThunk(__dirname + '/public/htmlfilename.html'); })); 

此外,请注意,如果您使用koa-static,并且将index.html放在公共文件夹(链接到koa-static的文件夹)中,则默认情况下会在根url上提供index.html,而不需要任何代码。 这是一个惯例。

将文件stream传递给koa主体

这与使用普通文件系统的上述解决scheme非常相似,但它利用koa能力将可读stream作为响应主体。 所以我们唯一需要做的就是打开一个可读的stream到一个文件并传递给koa上下文体。 在此之前给koa一个提示,这是htmltypes的回应。

 import { createReadStream } from 'fs'; public async handle(ctx, next) { ctx.type = 'html'; ctx.body = createReadStream('index.html'); } 

那怎么样,用koa-static

 app.all("/", async(ctx, next) => serve(`${__dirname}/public`)( Object.assign(ctx, { path: 'index.html' }), next) );