2014-12-06 16 views
8

使用shelf_static担任过飞镖静态网页是没有问题的:如何使用Dart和书架同时提供动态页面和静态页面?

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罚款:

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/home.html给我没有找到。

我是否应该尝试使用shelf_static来做到这一点?如果不是,那么正确的方法是什么? 谢谢!

回答

9

您可以使用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}'); 
}); 
+0

啊 - 这不仅仅是回退处理程序。优秀。 – th65 2014-12-06 20:56:15

2

A fallbackHandler可以指定为Router。看来在这里使用静态处理程序解决了这个问题。

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

的原因是shelf_route方法,如get必须充分匹配的路径。使用静态文件时,您不需要完全匹配,因为路径的其余部分会告诉您文件的路径。

为此,您需要使用add方法,并设置exactMatch: false作为目前的方法,如getpost等不暴露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); 

} 

FYI我也添加了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(); 
} 

addStaticAssetHandler电话createStaticHandler在幕后,但也支持调用的酒吧服务于发展方式这是非常方便东西像聚合物