0

編集 :

問題を要約すると、最初に ajax を使用して何かを投稿すると、 req.body 値が設定されますが、ページを再度ロード (F5) したり、別の POST 要求を実行したりしても、この値はリセットされません。データは設定されたままであり、同じ値のままであり、再度更新されることはありません (サーバーをリセットするまで)

元の投稿:

私は Express.js の使用に慣れていません。

以下のコードを使用して、非常に基本的な AJAX フォームの送信を実行しています。

sites_edit: function(req, res)
{
    if (req.route.method == 'post')
    {
        //console.log('========== POST');
        var oSite = req.param('site');
        var SiteModel = models.Site;
        //console.log(oSite);
        //console.log(req.body);

        var pCallback = function()
        {
            oSite.owner = app.getOwner();
            new SiteModel(oSite).save(function(e)
            {
                //console.log('saved.');
                //console.log(e);
                var aRet = app.analyzeSave(e);
                if (aRet.success)
                    aRet.site = oSite;

                res.json(aRet);
            });
        };

        if (oSite.id)
        {
            models.Site.findById(oSite.id, function(err, oTmpSite)
            {
                if (err)
                    throw new Error(err);

                if (oTmpSite.owner != app.getOwner().id)
                    throw new Exception('bad owner');

                pCallback();
            });
        }
        else
            pCallback();

        return;
    }

    // Handling GET request here
    // (...)
}

提出されたデータは次のようなものです:

site[id]:
site[name]:
site[address]:
site[postal_code]:
site[city]:
site[phone]:
site[email]:

問題は、フォームを初めて投稿するときに、欠落しているフィールドに対して (生成された) エラーが発生することです。しかし、もう一度送信すると、Firebug のネットワーク監視で 1 つのイベントしか取得できませんが、「headers already sent」エラーを含む 2 つの新しい node.js POST 呼び出しが発生します。さらに、req.body のデータがスタックされます。

つまり、コンソールに次の出力が表示されます。

Starting server in environment: local
Express app started on port 80
POST /configuration/site/enregistrer 200 9ms - 262
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:645:11)
    at ServerResponse.res.setHeader (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\patch.js:59:22)
    at next (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\proto.js:153:13)
    at multipart (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\multipart.js:60:27)
    at module.exports (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\bodyParser.js:57:9)
    at IncomingMessage.module.exports (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\urlencode
d.js:68:11)
    at IncomingMessage.EventEmitter.emit (events.js:90:17)
    at IncomingMessage._emitEnd (http.js:366:10)
    at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:149:23)
    at Socket.socket.ondata (http.js:1704:22)
POST /configuration/site/enregistrer 200 10ms - 128
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:645:11)
    at ServerResponse.res.setHeader (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\patch.js:59:22)
    at next (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\proto.js:153:13)
    at multipart (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\multipart.js:60:27)
    at module.exports (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\bodyParser.js:57:9)
    at IncomingMessage.module.exports (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\urlencode
d.js:68:11)
    at IncomingMessage.EventEmitter.emit (events.js:90:17)
    at IncomingMessage._emitEnd (http.js:366:10)
    at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:149:23)
    at Socket.socket.ondata (http.js:1704:22)
POST /configuration/site/enregistrer 200 7ms - 128

req.body 値をデバッグすると、次のようになります。

// First AJAX submit
{ site:
   { id: '',
     name: '',
     address: '',
     postal_code: '',
     city: '',
     phone: '',
     email: '' } }
// Second AJAX submit
{ site:
   { id: '',
     name: [ '', '' ],
     address: [ '', '' ],
     postal_code: [ '', '' ],
     city: [ '', '' ],
     phone: [ '', '' ],
     email: [ 'site[id]=', '' ] } }
// And another POST request is (strangely) handled by Express.js during the 2nd AJAX submit, which leads to third dump of the (apparently updated) variable
{ site:
   { id: '',
     name: [ '', '', '' ],
     address: [ '', '', '' ],
     postal_code: [ '', '', '' ],
     city: [ '', '', '' ],
     phone: [ '', '', '' ],
     email: [ 'site[id]=', 'site[id]=', '' ] } }

マジで、ここで一体何が起きているんだ?それはリモートでも可能ですか?

助けてくれてありがとう!

編集:

フォームを 1 回送信した後にページを更新すると、さまざまな HTTP リクエスト (静的 js/css ファイルを取得するため) に広がる "headers already sent" エラーが多数発生します。

以下のようなエラー:

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:645:11)
    at ServerResponse.res.setHeader (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\patch.js:59:22)
    at next (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\proto.js:153:13)
    at multipart (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\multipart.js:60:27)
    at module.exports (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\bodyParser.js:57:9)
    at IncomingMessage.module.exports (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\urlencode
d.js:68:11)
    at IncomingMessage.EventEmitter.emit (events.js:123:20)
    at Object.resume (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\node_modules\pause\index.js:25:18)
    at resume (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\static.js:61:13)
    at SendStream.error (E:\nodejs\projects\arent\node_modules\express\node_modules\connect\lib\middleware\static.js:73:37)

AJAX で送信する前にページを更新すると、これらのエラーは発生しません。

4

1 に答える 1

0

申し訳ありませんが、解決策は明らかではありません。

しかし、あなたのexpressjsコードは奇妙です:私のメソッド処理はしばしば次のようになります:

app.post('/enregistrer/:site', function (req, res) {
  ...
}

をテストする必要がないようにreq.route.method

エラー メッセージCan't set headers after they are sent.は、応答を終了しないこと、および次の応答が同じであることを示唆しています。

ただし、 のres.jsonように動作する を使用しますres.send。したがって、応答を送信する必要があります。

または、応答コードでres.sendoures.jsonを 2 回使用し、2 回目にヘッダーを再送信しますか?

于 2013-01-12T23:34:46.750 に答える