6

我的印象是 DART 程序不能托管在网络服务器中。有人可以请教我吗?

4

5 回答 5

6

是的,它可以(尽管这不是它的主要用例)。

来自Google Plus,2013 年 2 月 28 日

最后我设法让 Dart 在 Apache CGI 中工作!我没有找到任何有关此的信息,所以我自己尝试了。这是我的做法(Apache 2.2 和 Ubuntu)...

来自news.dartlang.org,2012 年 5 月 26 日

今天,Sam McCall 宣布了 mod_dart:运行嵌入在 Apache 中的 Dart 应用程序的能力!就像 PHP、Perl、Python 和许多其他脚本语言一样,您现在可以使用 Dart 从 Apache Web 服务器内部为您的服务器端 Web 应用程序提供动力。

这两个都是“概念证明”,但它们表明 Dart 可以嵌入到 Apache 等 Web 服务器中。

现在的“但是……”

尽管已经证明 Dart 可以嵌入到 Web 服务器中,但 Dart 更像 node.js,因为服务器端 dart 二进制文件提供了一个 VM 供应用程序使用。该应用程序可以包括它自己的网络服务器,例如:

main() {
  var server = new HttpServer();

  server.addRequestHandler(
     (req) => true,   // matcher - should this function handle this request?
     (req, res) {     // handler - what should happen when this request matches?
       res.outputStream.write("${req.method}: ${req.path}"); // eg: GET: /foo
       res.outputStream.close();
     });

  server.listen('127.0.0.1', 8080);
于 2013-02-21T10:17:01.643 回答
1

Dartlang 2.3 中的示例 Apache CGI:

将“dartaotruntime”复制到“/var/www/your-site/cgi-bin”

$ chown apache:apache dartaotruntime

创建文件 test.cgi

#!/bin/sh

BASE=/var/www/your-site/cgi-bin
$BASE/dartaotruntime $BASE/test.aot

$ chmod 0755 test.cgi

$ chown apache:apache test.cgi

创建文件 test.dart

import 'dart:io';

void main(List<String> args) {
        Map<String, String> envVars = Platform.environment;
        print("Content-Type: text/html\n");

        String input = "";
        if (envVars['REQUEST_METHOD'] == 'POST') {
                var content_length = int.parse(envVars['CONTENT_LENGTH']);
                while(input.length < content_length) {
                        input += stdin.readLineSync();
                }
        }
    print("""
<html>
<form method="post" action="test.cgi">
Name: <input type="text" name="name" value="" />
Email: <input type="text" name="email" value="" />
<input type="submit" value="Submit" />
</form>
<p><strong>ENV:</strong> {$envVars}</p>
<p><strong>INPUT:</strong> {$input}</p>
</html>""");
}

$ dart2aot test.dart test.aot

$ chown apache:apache test.aot

运行 cgi: https: //www.your-site.com/cgi-bin/test.cgi

于 2019-05-23T14:08:49.683 回答
1

您可以使用 cgi-bin apache 环境像 perl 脚本一样运行 dart。我在我的 Mac 上使用 XAMPP 对其进行了测试,它可以工作

#!/usr/local/bin/dart
import 'dart:io';
void main() {
    Map<String, String> envVars = Platform.environment;
    print("Content-Type: text/html\n");
    String input = "";
    if (envVars['REQUEST_METHOD'] == 'POST') {
        var content_length = int.parse(envVars['CONTENT_LENGTH']);
        while(input.length < content_length) {
            input += stdin.readLineSync();
        }
    }
    print("""
        <html>
        <form method="post">
        Name: <input type="text" name="name" value="" />
        Email: <input type="text" name="email" value="" />
        <input type="submit" value="Submit" />
        </form>
        <p><strong>QUERY_STRING:</strong> ${envVars['QUERY_STRING']}</p>
        <p><strong>ENV:</strong> {$envVars}</p>
        <p><strong>INPUT:</strong> {$input}</p>
        </html>
        """
    );
}

最初,error_log 中出现了一些错误,xampp 库无法正常工作。我只需从日志中指示的位置复制到xampp的lib目录即可正常工作。

==> /Applications/XAMPP/xamppfiles/logs/error_log <== [Sun Feb 23 14:08:12.799968 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] AH01215: dyld: Symbol not找到:_sqlite3_bind_blob64:/Applications/XAMPP/xamppfiles/cgi-bin/dart.dart

[Sun Feb 23 14:08:12.800332 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] AH01215:引用自:/System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard: /Applications/XAMPP/xamppfiles/cgi-bin/dart.dart

[Sun Feb 23 14:08:12.800432 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] AH01215:预计在:/Applications/XAMPP/xamppfiles/lib/libsqlite3.dylib:/Applications/XAMPP /xamppfiles/cgi-bin/dart.dart

[Sun Feb 23 14:08:12.800529 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] AH01215: 在 /System/Library/PrivateFrameworks/BaseBoard.framework/Versions/A/BaseBoard: /Applications /XAMPP/xamppfiles/cgi-bin/dart.dart

[Sun Feb 23 14:08:12.800581 2020] [cgi:error] [pid 91112] [client 127.0.0.1:64109] 标头之前的脚本输出结束:dart.dart

我使用这些命令来更新库:

ln -s `which dart` /usr/local/bin/dart
sudo cp /System/Library/Frameworks/ImageIO.framework//Versions/A/Resources/libJPEG.dylib  /Applications/XAMPP/xamppfiles/lib/libJPEG.dylib 
sudo cp /System/Library/Frameworks/ImageIO.framework//Versions/A/Resources/libTIFF.dylib  /Applications/XAMPP/xamppfiles/lib/
sudo cp /System/Library/Frameworks/ImageIO.framework//Versions/A/Resources/libPng.dylib  /Applications/XAMPP/xamppfiles/lib/
sudo cp /usr/lib/libsqlite3.dylib  /Applications/XAMPP/xamppfiles/lib/

使用 QueryString 和 Post 查看结果:

在此处输入图像描述

不要忘记在脚本的第一行设置 dart 可执行文件的正确路径。我通常将它链接到 /usr/local/bin

于 2020-02-23T18:21:57.257 回答
0

mod-dart 的开发已经停滞了 2 年。

于 2015-01-11T04:20:39.227 回答
0

只是想补充一点,这些天 - 与过时的原始答案相反 - 服务器端飞镖绝对是一回事。这样做的方法是使用Alfred之类的东西运行 dart 服务器端应用程序,然后使用反向代理传递数据,这样你就可以使用 Lets Encrypt 的 SSL。我个人使用 Nginx 遵循这样的指南: https ://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu -16-04

为我的 dart 应用替换 nodejs。

于 2021-05-16T10:31:06.897 回答