9

Dartを使用shelf_staticして静的な Web ページを提供することは問題ありません。

var staticHandler = createStaticHandler(staticPath, defaultDocument:'home.html');
io.serve(staticHandler, 'localhost', port).then((server) {
  print('Serving at http://${server.address.host}:${server.port}');
});

shelf_route動的な Web ページには罰金を使用できます。

Router routes = new Router()
  ..get('/item/{itemid}', handler.doItem);
var handler = const shelf.Pipeline()
  .addHandler(routes.handler);

io.serve(handler, 'localhost', port).then((server) {
  print('Serving at http://${server.address.host}:${server.port}');
});

しかし、静的ハンドラーを動的バージョンに追加するのに苦労しています。私が試したことは次のとおりです。

Router routes = new Router()
  ..get('/item/{itemid}', handler.doItem)
  ..get('/', staticHandler);

また ...

  ..get('/.*', staticHandler);

また ...

  ..get('/{any}', staticHandler);

要求すると、指定されたデフォルトhome.htmlページが表示されますhttp://localhost:8080/が、既存のページhttp://localhost:8080/home.htmlを明示的に要求すると、Not Found が表示されます。

でこれをやろうとしてもいけませんshelf_staticか?そうでない場合、正しいアプローチは何ですか?ありがとう!

4

3 に答える 3

6

その理由は、のshelf_routeようなメソッドgetがパスと完全に一致する必要があるためです。静的ファイルでは、パスの残りの部分がファイルへのパスを示しているため、完全に一致する必要はありません。

このためには、addメソッドを使用し、exactMatch: false現在、などのメソッドがget公開postされていないため、設定する必要がありますexactMatch

以下の作品

void main(List<String> args) {

  Logger.root.onRecord.listen(print);

  var staticHandler = createStaticHandler('../static', defaultDocument:'home.html');

  final root = router()
    ..get('/item/{itemid}', (Request request) => 'handling the item')
    ..add('/', ['GET'], staticHandler, exactMatch: false);

  printRoutes(root);

  io.serve(root.handler, InternetAddress.ANY_IP_V6, 9999);

}

参考までに、 mojitoと呼ばれるより高いレベルのフレームワークを追加しました。これは、シェルフ コンポーネントの多くにある薄い接着層であり、これを少し簡単にします。

まだ少し新しく、ドキュメントも不十分ですが、興味がある場合は、次のことができます

void main(List<String> args) {

  Logger.root.onRecord.listen(print);

  final app = mojito.init();

  app.router
    ..get('/item/{itemid}', (String itemid) => 'handling the item $itemid')
    ..addStaticAssetHandler('/', fileSystemPath: '../static', 
        defaultDocument:'home.html');

  app.start();
}

addStaticAssetHandlercreateStaticHandler舞台裏での呼び出しだけでなく、開発モードでの pub serve の呼び出しもサポートします。これは、ポリマーのようなものに非常に便利です

于 2014-12-08T01:03:39.413 に答える
2

fallbackHandlerは を指定できますRouter。ここで静的ハンドラーを使用すると、問題が解決するようです。

Router routes = new Router(fallbackHandler: staticHandler)
  ..get('/item/{itemid}', handler.doItem);
于 2014-12-06T14:34:39.363 に答える