2015-11-08 281 views
1

我正在寻找有关如何改进此文件服务器的指导。在Dart服务器上适当使用“路由”和“路径”库

目前它无法处理POST,因为每个请求都被传递到http_server库。它也天真地路由URL;可以用Router s来改善吗?也许path lib也可以提供帮助?

import 'dart:io'; 
import 'package:http_server/http_server.dart'; 

// TODO: use these imports :) 
import 'package:path/path.dart' as path; 
import 'package:route/url_pattern.dart'; 

final address = InternetAddress.LOOPBACK_IP_V4; 
const port = 4040; 

final buildPath = Platform.script.resolve('web'); 
final publicDir = new VirtualDirectory(buildPath.toFilePath()); 

main() async { 
    // Override directory listing 
    publicDir 
    ..allowDirectoryListing = true 
    ..directoryHandler = handleDir 
    ..errorPageHandler = handleError; 

    // Start the server 
    final server = await HttpServer.bind(address, port); 
    print('Listening on port $port...'); 
    await server.forEach(publicDir.serveRequest); 
} 

// Handle directory requests 
handleDir(dir, req) async { 
    var indexUri = new Uri.file(dir.path).resolve('index.html'); 
    var index = new File.fromUri(indexUri); 
    if (!await index.exists()) { 
    handleError(req); 
    return; 
    } 
    publicDir.serveFile(index, req); 
} 

// Handle error responses 
handleError(req) { 
    req.response.statusCode = HttpStatus.NOT_FOUND; 
    var errorUri = new Uri.directory(publicDir.root).resolve('error.html'); 
    var errorPage = new File.fromUri(errorUri); 
    publicDir.serveFile(errorPage, req); 
} 

回答

1

我没有看到解决这个

await for (var req in server) { 
    // distribute requests to different handlers 
    if(req.method == 'POST') { 

    } else { 
    publicDir.serveRequest(req); 
    } 
} 

的方式或者你可以使用shelfshelf_routeshelf_static它允许您指定的请求和处理程序更声明的风格,但该做的罩

https://pub.dartlang.org/search?q=shelf_static

+0

感谢您提到货架,我会看看 – Ganymede

+0

有关'path'包的问题,​​请添加更具体的问题。我没有使用带有uris的'path'包,只使用文件路径,但它非常简单,只能在字符串上运行。 –

+0

真棒,只是我正在寻找的建议。我知道我的问题是模糊的:) – Ganymede

0

shelf_static下相同非常适合文件服务器,并且具有路由的服务器可以使用shelf_route完成。

import 'dart:io'; 

import 'package:shelf_io/shelf_io.dart' as io; 
import 'package:shelf_static/shelf_static.dart'; 
import 'package:path/path.dart' show join, dirname; 

final address = InternetAddress.LOOPBACK_IP_V4; 
const port = 8080; 

main() async { 
    var staticPath = join(dirname(Platform.script.toFilePath()), '..', 'web'); 
    var staticHandler = createStaticHandler(staticPath, defaultDocument: 'index.html'); 
    var server = await io.serve(staticHandler, address, port); 
}