20

我想要做的是在调用索引路由(即 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 文件放在 public 目录中):

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

但这没有用。

那么谁能告诉我我必须做什么?

4

3 回答 3

20

有几种方法可以做到这一点,这里有两种。

模板引擎

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

要安装它:

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");
}); 

普通文件系统

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

为了能够将它与 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 的文件夹)中,默认情况下它将在根 url 上提供 index.html,而无需任何代码。这是一个约定。

于 2014-06-09T15:11:04.020 回答
17

将文件流传递给 koa body

这与上面使用纯文件系统的解决方案非常相似,但它利用了 koa 将可读流作为响应主体传递的能力。所以我们唯一需要做的就是打开一个文件的可读流并将其传递给 koa 上下文主体。在此之前给 koa 一个提示,这是html类型的响应。

import { createReadStream } from 'fs';

public async handle(ctx, next) {
    ctx.type = 'html';
    ctx.body = createReadStream('index.html');
}
于 2017-08-18T07:27:40.013 回答
3

这个怎么样,使用 koa-static

app.all("/", async(ctx, next) => 
  serve(`${__dirname}/public`)(
    Object.assign(ctx, { path: 'index.html' }), 
    next)
  );
于 2017-09-27T16:20:46.613 回答