4

ユーザーがレコードを作成または更新するためにフォーム(マルチパート)に入力して送信する実稼働サーバー(ubuntu)があります。使用しようとするreq.allParams()と、不完全なデータを持つオブジェクトが取得されることがあります。

これが私が通常得るものだとしましょう:

data: {
    id: '58155',
    name: 'The Gallery Name',
    email: 'gallery@gmail.com',
    phone: '(+54911)68460005',
    url: 'www.theurl.com',
    workingHours: 'Tuesday - Friday 3 - 8 pm',
    artists: ['58350', '15503', '58346', '58347', '58348', '58349'],
    locations: [{ 
      country: 1,
      state: null,
      city: 45,
      zip: '33175',
      address: '' }
    ],
    showOnGuide: true,
    preferredLanguage: 'en',
    events: [1, 4, 5]
  }
};

しかし、時々私は得る:

   data: {
        id: '58155',
        name: 'The Gallery Name',
        email: 'gallery@gmail.com',
        phone: '(+54911)68460005',
        url: 'www.theurl.com',
        workingHours: 'Tuesday - Friday 3 - 8 pm',
        artists: ['58350', '15503', '58346', '58347', '58348', '58349']
      }
    };

私はフォームをチェックしましたが、それらは正しいので、明らかなのは最後のキー (フォームフィールド) だけが欠落していることだけです. POST タイムアウトに関連している可能性がありますか?

明確にするために、これは私がフォーマットを行う前にデータを取得する方法であり、ログを配置することさえありますsails/node_modules/skipper/index.js

/// .. some code
MultipartBodyParser(req, res, function(err) {
    if (err) return next(err);
    console.log(req.body);
/// ... some code
}

時々部分的な情報を表示します。ローカル マシンでこの動作を確認したことはありませんが、前述したように、30 回ごとに 1 回のようにめったに発生しませんが、クライアントが送信データを失うことは依然としてかなり悲惨なことです。

これは、セイル、エクスプレス、またはスキッパーの問題のようです。

私はこれを数日間デバッグしようとしてきましたが、最初はなぜ、いつそれが起こったのか何も知らなかったので、これが私が得た最も近いものです.フォームが正しく送信されていることを知っていますが、帆走不完全なものを受け取るか、正しく解析しません。

誰かが同様の問題に遭遇しましたか? これを解決するための考えは大歓迎です。

バージョン:

  • ノード 0.12
  • 帆 0.11.3

注:これは、ファイルのアップロードの有無にかかわらず発生します

編集:ネットワーク マネージャー (NetBalancer) を使用して、アップロード速度を可能な限り 1 バイト/秒下げてみましたが、奇妙な動作が得られないため、遅いネットワーク アップロードが関係しているようには見えません。少なくとも手動テストでは、NetBalancer の信頼性もよくわかりません。

更新: セイルを 0.12.1 に、ノードを 5.8.0 に更新しましたが、問題は解決しません。

ありがとう

4

1 に答える 1

4

私は問題が何であるかを理解しました。アップロード速度が遅い接続でのみ表示され、特に画像をアップロードする場合、問題は、ファイル入力を検出したときにスキッパーがフォームデータを処理する方法です (入力ファイルが空の場合でも発生するようです) テキスト入力を閉じますストリームなので、キャプチャされることはありません。ここで、解決策は、ファイル入力が他のすべての入力の後に配置されるようにフォームをフォーマットすることです (html 仕様では、ブラウザーは入力を順番に送信する必要があるため)。スタイルが変わるので、私が思いついた解決策は、この小さなスニペットを使用することです:

(function () {
    var $form = $('form[enctype="multipart/form-data"]');
    var $fileInputs = $($form.find('input[type="file"]'));
    $form.submit(function() {
      $fileInputs.detach();
      $form.append($fileInputs);
    })
  })();

ファイル入力をフォームから切り離し、最後に追加するため、常に最後に送信されます。

セイルには入力順序の重要性についてのメモがあると思いますが、見落としがちです。これについてホームページに大きな警告を表示する必要があります...

于 2016-04-29T05:44:21.630 に答える