如何使用Dart和shelf为动态和静态页面提供服务?

如何使用Dart和shelf为动态和静态页面提供服务?,dart,dart-shelf,Dart,Dart Shelf,使用shelf\u static通过Dart为静态网页提供服务没有问题: var staticHandler=createStaticHandler(staticPath,defaultDocument:'home.html'); service(staticHandler,'localhost',port)。然后((服务器){ 打印('服务于http://${server.address.host}:${server.port}'); }); 我可以使用shelf\u routefine来创

使用
shelf\u static
通过Dart为静态网页提供服务没有问题:

var staticHandler=createStaticHandler(staticPath,defaultDocument:'home.html');
service(staticHandler,'localhost',port)。然后((服务器){
打印('服务于http://${server.address.host}:${server.port}');
});
我可以使用
shelf\u route
fine来创建动态网页:

路由器路由=新路由器()
..get('/item/{itemid}',handler.doItem);
var handler=const shelf.Pipeline()
.addHandler(routes.handler);
service(处理程序,'localhost',端口)。然后((服务器){
打印('服务于http://${server.address.host}:${server.port}');
});
但我正在努力将静态处理程序添加到动态版本中。 我尝试过的事情包括:

路由器路由=新路由器()
…get('/item/{itemid}',handler.doItem)
..get('/',staticHandler);
或者

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

.get('/{any}',staticHandler);
如果我请求
http://localhost:8080/
但明确要求现有页面
http://localhost:8080/home.html
给我找不到的信息

我甚至不应该尝试使用
shelf\u static
来实现这一点吗?如果不是,正确的方法是什么?
谢谢

A
fallbackHandler
可以为
路由器指定。在这里使用静态处理程序似乎解决了这个问题。

路由器路由=新路由器(fallbackHandler:staticHandler)
..get('/item/{itemid}',handler.doItem);
您可以使用。它创建一个处理程序链,如果前一个处理程序给出404或405响应,则移动到下一个处理程序

var staticHandler=createStaticHandler(staticPath,defaultDocument:'home.html');
var routes=新路由器()
…获取('/item/{itemid}',handleItem);
var handler=newcascade()
.add(staticHandler)
.add(routes.hander)
.handler;
service(处理程序,'localhost',端口)。然后((服务器){
打印('服务于http://${server.address.host}:${server.port}');
});

原因是
货架路径
方法,如
get
必须完全匹配路径。对于静态文件,您不需要精确匹配,因为路径的其余部分会告诉您文件的路径

为此,您需要使用
add
方法并设置
exactMatch:false
,因为当前的
get
post
等方法不公开
exactMatch

以下作品

void main(列表参数){
Logger.root.onRecord.listen(打印);
var staticHandler=createStaticHandler(“../static”,defaultDocument:'home.html”);
最终根=路由器()
..get('/item/{itemid}',(请求)=>'处理项目')
…添加(“/”、[“获取”]、staticHandler、exactMatch:false);
打印路径(根);
io.service(root.handler,InternetAddress.ANY_IP_V6,9999);
}
仅供参考,我已经添加了一个更高级别的框架,称为,它是许多架子组件上的一层薄薄的粘合层,这使这变得更容易

这仍然是一种新的和缺乏记录,但如果你感兴趣,你可以做以下事情

void main(列表参数){
Logger.root.onRecord.listen(打印);
final app=mojito.init();
应用程序路由器
…get('/item/{itemid}',(String itemid)=>'处理项$itemid')
…addStaticAssetHandler(“/”,文件系统移情:“../static”,
defaultDocument:'home.html');
app.start();
}

addStaticAssetHandler
在后台调用
createStaticHandler
,但也支持在开发模式下调用pub-service,这对于polymer之类的东西非常方便

Ah-这比仅使用回退处理程序要好。杰出的