2015-09-22 12 views
5

Ich bin neu in koa.js Bibliothek und ich brauche etwas Hilfe. Ich versuche, einfache REST-Anwendung mit Koa zu machen. Ich habe eine statische HTML-und Javascript-Dateien, die ich auf Route / und REST-API-Zugriff von /api/ dienen soll.Koa.js - Serving statische Dateien und REST API

Das ist mein Projekt Verzeichnisbaum:

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

Diese meine Quelle ist:

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 

ich koa-static habe versucht, koa-static-folder, koa-static-server Bibliotheken und weder funktioniert so bin ich etwas falsch zu machen .

Ich habe das ausprobiert und es funktioniert, aber ich habe keinen Zugriff auf meine REST api:

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

Macht meine Antwort Sinn, haben Sie andere Fragen? –

+0

Ich habe deine Antwort vergessen. Fast ein Jahr später, danke :) – suricactus

Antwort

9

Es war ein wenig schwierig für mich, was zu folgen Sie in Ihrem Beispielcode taten. .. Hier ist ein einfaches Beispiel, das alles tut Ihr Wunsch:

'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

Was ist der Zeiger 'this' im' this.body = 'hi from get'; '? – Believe2014

+0

Ich habe damit für Koa v2 gewrestlet, vielleicht können Sie einen Einblick geben? 'app.use (async (CTX, next) => { senden erwarten (CTX, path.join (__ dirname '../', 'Client/index.html')) })' I bekomme einen 404 nicht gefunden Fehler aus irgendeinem Grund ... Obwohl mit ein bisschen von einem Hack kann ich die einzelnen HTML-Datei, wenn es nicht der Ordner ist, kann ich nicht laden meine Bilder usw. – hoodsy

+0

@hoodsy Hast du jemals eine Antwort gefunden? Ich habe versucht, app.use (async (ctx, next) ... und war nicht in der Lage, das zu arbeiten. Versuchte verschiedene Varianten, aber nichts scheint zu funktionieren. – Nurpax

1

Von @Nurpax in den Kommentaren:

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

Der Schlüssel war, {root:<some path>} zu spezifizieren. Ich denke, das Problem in meinem Fall war, dass aus Sicherheitsgründen senden keine relativen Pfade oder Pfade außerhalb des Projektbaums erlaubt. Die Angabe des Root-Parameters und die Angabe eines relativen Dateinamens schien das Problem zu beheben. Ich vermute, dass ich koa-send erwartet habe, um einen Fehler/eine Warnung über die Knotenausgabe zu protokollieren.

+1

Keine Ahnung warum hast du Versprechen in Code gesetzt. Verwenden Sie einfach abwarten :) app.use (async (CTX) => { senden abwarten (ctx, '/index.html', { root: STATIC_FOLDER_PATH, }); }); –

Verwandte Themen