web-dev-qa-db-ja.com

Koa.js-静的ファイルとREST API

私はkoa.jsライブラリを初めて使用するので、助けが必要です。 koaを使用して単純なRESTアプリケーションを作成しようとしています。ルート/およびREST = /api/からアクセスするAPI。

これは私のプロジェクトディレクトリツリーです:

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-statickoa-static-folderkoa-static-serverライブラリを試しましたが、どちらも機能しないため、何か問題があります。

私はこれを試しましたが、機能しますが、REST api:にアクセスできません。

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

サンプルコードであなたがしていることを理解するのは少し難しかったです...これはあなたが望むすべてを行う簡単な例です:

'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);
17
James Moore

コメントの@Nurpaxから:

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

重要なのは、{root:<some path>}を指定することでした。私の場合の問題は、セキュリティ上の理由から、sendが相対パスまたはプロジェクトツリー外のパスを許可しないことだと思います。ルートパラメータを指定し、それに関連するファイル名を指定すると、問題が解決したようです。 koa-sendがこれに関するノード出力にエラー/警告をログに記録することを期待していたと思います。

2
hoodsy
const root = require('path').join(__dirname, 'client', 'build');
app.use(serve(root));

app.use(async ctx => {
    await send(ctx, `/index.html`, {
        root
    });
});
0
Fausta Leonardo