Показать статический html файл с помощью koa.js

То, что я хочу сделать, это служить файлу index.html при вызове маршрута индекса (то есть localhost: 3000).

Я использую 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");
});

Но это не сработало.

Так может ли кто-нибудь сказать мне, что я должен делать?

Ответ 1

Ну, есть несколько способов сделать это, вот два из них.

Шаблонный двигатель

Самый простой способ - использовать механизм шаблонов, например swig или jade для обслуживания файла.

Чтобы установить его, выполните следующие действия:

npm install -s swig

Чтобы сделать это с помощью co-views, просто сделайте

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

Обычная файловая система

Или, если вы не хотите использовать механизм шаблонов, вы можете использовать обычную библиотеку Node File System.

Чтобы иметь возможность использовать его с выходом, вы должны обернуть функцию в обещание.

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 по корневому URL-адресу без каких-либо код. Это соглашение.

Ответ 2

Передача потока файлов в тело koa

Это очень похоже на решение выше с простой файловой системой, но оно использует способность koa передавать читаемые потоки в качестве тела ответа. Итак, единственное, что нам нужно сделать, это открыть читаемый поток в файл и передать его в тело контекста koa. Перед этим даем подсказку koa, что это ответ типа html.

import { createReadStream } from 'fs';

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

Ответ 3

Как насчет этого, используя koa-static

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