我想要做的是在调用索引路由(即localhost:3000)时提供index.html文件。
我使用koa-router进行路由,所以我的路由如下:
app.all("/", function * (next){
//Send the file here
});
我试着像这样使用koa-static:
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");
});
但那没用。
所以有人能告诉我我必须做什么吗?
答案 0 :(得分:18)
有几种方法可以做到,其中有两种方法。
最简单的方法可能是使用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");
});
或者,如果您不想使用模板引擎,则可以使用普通节点File System库。
为了能够将它与yield一起使用,你必须将函数包装在一个promise中。
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的文件夹),则默认情况下它会在index.html上提供根网址没有任何代码。这是一个惯例。
答案 1 :(得分:10)
将文件流传递给koa正文
这与上面使用普通文件系统的解决方案非常相似,但它利用koa功能将可读流作为响应主体传递。所以我们唯一需要做的就是打开一个可读的文件流并将其传递给koa上下文体。在此之前向koa提示这是 html 类型的响应。
import { createReadStream } from 'fs';
public async handle(ctx, next) {
ctx.type = 'html';
ctx.body = createReadStream('index.html');
}
答案 2 :(得分:2)
这个怎么样,使用koa-static
app.all("/", async(ctx, next) =>
serve(`${__dirname}/public`)(
Object.assign(ctx, { path: 'index.html' }),
next)
);