如何使用Dart和shelf来提供动态和静态页面? [英] How to serve both dynamic and static pages with Dart and shelf?

查看:504
本文介绍了如何使用Dart和shelf来提供动态和静态页面?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用 shelf_static 通过Dart提供静态网页没有问题:





< pre class =lang-dart prettyprint-override> 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 网页:

 路由器路由= 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}');
});

但是我在为动态版本添加静态处理程序时遇到了困难。
我试过的东西包括:

 路由器路由= new Router b $ b ..get('/ item / {itemid}',handler.doItem)
..get('/',staticHandler);

或...

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

或...

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

所有这些都给我指定的默认值 home.html page如果我请求 http:// localhost:8080 / 但明确要求一个现有的页 http:// localhost:8080 / home .html 给我找不到。



我应该不会试图用 shelf_static ?如果没有,什么是正确的方法?
谢谢!

解决方案

您可以使用 Cascade 。它创建一个处理程序链,如果前一个响应给出404或405响应,则移动到下一个处理程序链。

  var staticHandler = createStaticHandler(staticPath,defaultDocument:'home.html'); 
var routes = new Router()
..get('/ item / {itemid}',handleItem);

var handler = new Cascade()
.add(staticHandler)
.add(routes.hander)
.handler;
io.serve(handler,'localhost',port).then((server){
print('Serving at http:// $ {server.address.host}:$ {server.port }');
});


Using shelf_static to serve static web pages through Dart is no problem:

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

and I can use shelf_route fine for dynamic web pages:

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}');
});

But I'm struggling with adding a static handler to the dynamic version. Things I've tried include:

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

or ...

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

or ...

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

All of which give me the specified default home.html page if I request http://localhost:8080/ but explicitly asking for an existing page http://localhost:8080/home.html gives me Not Found.

Should I not even be trying to do this with shelf_static? If not, what would be the correct approach? Thanks!

解决方案

You can use Cascade. It creates a chain of handlers, moving to the next one if the previous one gives a 404 or 405 response.

var staticHandler = createStaticHandler(staticPath, defaultDocument:'home.html');
var routes = new Router()
    ..get('/item/{itemid}', handleItem);

var handler = new Cascade()
    .add(staticHandler)
    .add(routes.hander)
    .handler;
io.serve(handler, 'localhost', port).then((server) {
  print('Serving at http://${server.address.host}:${server.port}');
});

这篇关于如何使用Dart和shelf来提供动态和静态页面?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆