【问题标题】:Appropriate use of the 'route' and 'path' libs on a Dart server在 Dart 服务器上适当使用“路由”和“路径”库
【发布时间】:2015-12-07 09:45:56
【问题描述】:

我正在寻找有关如何改进此文件服务器的指导。

目前它无法处理 POST,因为每个请求都被移交给 http_server 库。它还天真地路由 URL;这可以使用Routers 改进吗?也许path 库也可以提供帮助?

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

【问题讨论】:

    标签: dart server


    【解决方案1】:

    我没有办法解决这个问题

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

    或者,您可以将shelf 包与shelf_routeshelf_static 一起使用,它允许您以更具声明性的样式分配请求和处理程序,但在后台执行相同操作

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

    【讨论】:

    • 谢谢你提到架子,我去看看
    • 有关path 包的问题,​​请添加更具体的问题。我没有使用带有 uris 的 path 包,只使用文件路径,但它非常简单并且只对字符串进行操作。
    • 太棒了,正是我正在寻找的建议。我知道我的问题很模糊:)
    • 这个问题对你来说可能很有趣stackoverflow.com/questions/27332405
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-10
      • 2017-08-28
      • 2017-04-21
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多