3

サーバーへの http リクエストを処理するためにルートを使用しています。これは私の現在のルートコードです:

HttpServer.bind("127.0.0.1", 8080).then((server) {
    new Router(server)
    ..filter(new RegExp(r'/.*'), addCorsHeaders)
    ..filter(new RegExp(r'/admin/.*'), authenticate)
    ..serve(userGetURL, method: 'GET').listen(userGetHandler)
    ..serve(userPostURL, method: 'POST').listen(userPostHandler);
}); 

URL に POST している JSON データを取得しようとしています。データは、データベースからエンティティを取得し、JSON として呼び出し元に返すために使用されます。私は基本的に、すべてのデータを処理するサーバー アプリケーションと、それを表示するクライアント アプリケーションを作成しようとしています。

POST からデータを取得する方法がわかりません。私が試したことはすべて、ストリームをリッスンする必要がありますが、すでにリッスンされています。これは、私が POST データを取得しようとしている方法です:

userPostHandler(HttpRequest req) {
    req.listen((List<int> buffer) {
        // Return the data back to the client.
        res.write(new String.fromCharCodes(buffer));
        res.close();
    }
}

問題は、Bad state: Stream has already been listened to.エラーが発生することです。

編集:フィルター

Future<bool> authenticate(HttpRequest req) {
  if (req.method == 'POST') {
    // Post data is not null
    // Authenticate user
    String userName = '';
    String password = '';
    User user = new User();
    user.DBConnect().then((User user) {
      return new Future.value(user.ValidateUser(userName, password));
    });
  }
}

Future<bool> addCorsHeaders(HttpRequest req) {
  print('${req.method}: ${req.uri.path}');
  req.response.headers.add('Access-Control-Allow-Origin', '*, ');
  req.response.headers.add('Access-Control-Allow-Methods', 'POST, OPTIONS, GET');
  req.response.headers.add('Access-Control-Allow-Headers',
      'Origin, X-Requested-With, Content-Type, Accept');
  return new Future.value(true);
}
4

2 に答える 2

1

Route パッケージを使用したことはありませんが、なぜ Handler 内でリッスンする必要があるのだろうかと思います。処理したいプロパティにアクセスできませんか?

それ以外の場合は、試すことができます

req.asBroadcastStream().listen(...)

BroadcastStream は、複数のリスナーをサポートします。この記事の詳細情報データにストリームを使用する

于 2013-12-31T11:51:33.677 に答える
0

次のコードを使用して、POST を機能させることができました。

void main() {
    HttpServer.bind("127.0.0.1", 8080).then((server) {
        new Router(server)
        ..filter(new RegExp(r'/.*'), addCorsHeaders)
          ..filter(new RegExp(r'/admin/.*'), authenticate)
           ..serve(userGetURL, method: 'GET').listen(userGetHandler)
            ..serve(userPostURL, method: 'POST').listen(userPostHandler);
    }); 
}

Future userPostHandler(HttpRequest req) {
  bool headerSent = false;
  // Start listening before writing to the response.
  req.listen((List<int> buffer) {
    if (!headerSent) {
      req.response.write("User POST");
      headerSent = true;
    }
    req.response.write(new String.fromCharCodes(buffer));
    },
    // Use onDone to close the response.
    onDone: () => req.response.close()
  );
}

これが私が理解したものです。応答への書き込みは自動的に本文を排出し、POST データを破壊します。ここで述べたように。また、応答のリッスンは非同期で行われるため、close() が呼び出される前に完了する必要があります。

于 2014-01-03T15:56:04.033 に答える