2015-09-22 4 views
5

Я новичок в библиотеке koa.js, и мне нужна помощь. Я пытаюсь сделать простое приложение REST с помощью koa. У меня есть статические html и javascript файлы, которые я хочу обслуживать на маршруте / и REST API, получая доступ с /api/.Koa.js - обслуживающие статические файлы и API REST

Это мой проект дерево каталогов:

project 
├── server 
│   ├── node_modules 
│   ├── package.json 
│   └── src 
│    ├── config 
│    ├── resources 
│    └── server.js 
├── ui 
│   ├── app 
│   ├── bower.json 
│   ├── bower_components 
│   ├── dist 
│   ├── node_modules 
│   ├── package.json 
│   └── test 

Это мой источник:

var app = require('koa')(); 
app.use(mount('/api/places', require('../resources/places'))); 

// does not work 
var staticKoa = require('koa')(); 
staticKoa.use(function *(next){ 
    yield next; 
    app.use(require('koa-static')('../ui/app', {})); 
}); 
app.use(mount('/', staticKoa)); 

// does not work 
app.use(mount('/', function*() { 
    app.use(require('koa-static')('../ui/app/', {})); 
})); 

// does not work 
app.use(mount('/', function*() { 
    app.use(require('koa-static')('.', {})); 
})); 
// GET package.json -> 404 not found 

Я попытался koa-static, koa-static-folder, koa-static-server библиотеки и ни работает так, что я делаю что-то неправильно ,

Я попробовал это, и это работает, но у меня нет доступа к моему REST API:

var app = require('koa')(); 
app.use(require('koa-static')('../ui/app/', {})); 
+0

Имеет ли мой ответ смысл, есть ли у вас другие вопросы? –

+0

Я забыл о вашем ответе. Почти год спустя, спасибо :) – suricactus

ответ

9

Это было немного трудно для меня, чтобы следовать тому, что вы делали в вашем примере кода. .. Вот простой пример, который делает все, что ваше желание:

'use strict'; 
let koa  = require('koa'), 
    send = require('koa-send'), 
    router = require('koa-router')(), 
    serve = require('koa-static'); 

let app = koa(); 
// serve files in public folder (css, js etc) 
app.use(serve(__dirname + '/public')); 

// rest endpoints 
router.get('/api/whatever', function *(){ 
    this.body = 'hi from get'; 
}); 
router.post('/api/whatever', function *(){ 
    this.body = 'hi from post' 
}); 

app.use(router.routes()); 

// this last middleware catches any request that isn't handled by 
// koa-static or koa-router, ie your index.html in your example 
app.use(function* index() { 
    yield send(this, __dirname + '/index.html'); 
}); 

app.listen(4000); 
+0

Что такое указатель 'this' в' this.body = 'hi from get'; '? – Believe2014

+0

Я боролся с этим для koa v2, может быть, вы можете дать некоторое представление? 'app.use (асинхронной (CTX, следующий) => { ждут отправки (СТХ, path.join (__ имя-каталога, '../', 'клиент/index.html')) })' Я получить по ошибке 404 по какой-либо причине ... Хотя с небольшим взломом я могу обслуживать отдельный файл html, если это не папка, я не могу загрузить мои изображения и т. д. – hoodsy

+0

@hoodsy Вы когда-нибудь придумывали ответ? Я попробовал app.use (async (ctx, next) ... и не смог заставить это работать. Пробовал разные варианты, но ничего не работает. – Nurpax

1

от @Nurpax в комментариях:

app.use(async function (ctx, next) { 
    return send(ctx, '/index.html', { root: paths.client() 
}) 
.then(() => next()) }) 

Главное было указать {root:<some path>}. Я думаю, что проблема в моем случае состояла в том, что по соображениям безопасности send не разрешает относительные пути или пути за пределами дерева проектов. Указание параметра root, а затем предоставление имени файла относительно этого, казалось, устранило проблему. Я предполагаю, что я ожидал, что koa-send зарегистрирует сообщение об ошибке/предупреждение об этом выходе узла.

+1

Не знаю, почему вы поставили обещания в коде. Просто используйте ждать :) app.use (асинхронная (CTX) => { ждут отправки (CTX, '/index.html', { корень: STATIC_FOLDER_PATH, }); }); –

Смежные вопросы