2015-09-22 11 views
5

Sono nuovo nella libreria koa.js e ho bisogno di aiuto. Sto cercando di fare una semplice applicazione REST usando koa. Ho un file html e javascript statici che desidero pubblicare sul percorso / e API REST che accedono da /api/.Koa.js - serve file statici e API REST

Questo è il mio progetto di directory:

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

Questa è la mia fonte:

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 

Ho provato koa-static, koa-static-folder, koa-static-server librerie e nessuno dei due funziona così sto facendo qualcosa di sbagliato .

Ho provato questo e funziona, ma non hanno accesso al mio REST API:

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

La mia risposta ha senso, avete altre domande? –

+0

Ho dimenticato la tua risposta. Quasi un anno dopo, grazie :) – suricactus

risposta

9

era un po 'difficile per me seguire quello che stavi facendo nel codice di esempio. .. Ecco un semplice esempio che fa tutto la vostra voglia:

'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

Qual è il puntatore 'this' nel' this.body = 'hi from get'; '? – Believe2014

+0

Ho litigato con questo per koa v2, forse puoi fornire qualche informazione? 'app.use (asincrona (CTX, successiva) => { attendono inviare (CTX, path.join (__ dirname, '../', 'client/index.html')) })' I ottenere un errore 404 non trovato per qualche motivo ... Anche se con un po 'di un hack posso servire il singolo file html, se non è la cartella, non sono in grado di caricare le mie immagini, ecc. – hoodsy

+0

@hoodsy Hai mai trovato una risposta? Ho provato app.use (async (ctx, next) ... e non sono riuscito a farlo funzionare. Ho provato varie varianti diverse ma niente sembra funzionare. – Nurpax

1

Da @Nurpax nei commenti:

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

L'elemento chiave era specificare {root:<some path>}. Penso che il problema nel mio caso fosse che per motivi di sicurezza, l'invio non consente percorsi o percorsi relativi al di fuori della struttura del progetto. Specificare il parametro root e quindi dare un nome file relativo a quello sembrava risolvere il problema. Immagino mi aspettassi koa-send per registrare un errore/avvertimento sull'output del nodo a riguardo.

+1

Non ho idea del perché hai promesso codice. Basta usare attendere :) app.use (asincrona (CTX) => { attendono inviare (CTX, 'index.html', { root: STATIC_FOLDER_PATH, });} ); –