用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) );