2016-12-10 19 views
1

jquery ajaxとnode.jsを使用した単純なCRUDアプリケーションで、ノードとajaxでスキルを向上させようとしています。問題は、ノードサーバーのポストルータで処理されるポストリクエストを実行していて、すべて正常に動作していることです。それはproducts.jsonファイルに1つ多くの製品を追加しますが、最終的にはクライアントに応答を返さないため、最終的なres.send( "done")は機能せず、理由もわかりません。 。res.sendが正しく動作しない

AJAX

$("#create-form").on('submit',function(){ 
    event.preventDefault(); 
    var createIn = $("#create-input").val(); 
    $.ajax({ 
     url: '/products', 
     method:'POST', 
     data:JSON.stringify({name:createIn}), 
     contentType: "application/json", 
     dataType: "json", 
     success: function(data){ 
      console.log(data); 
      $("create-input").val(""); 
      $("get-button").click(); 
     } 
    }); 
}) 

ノード

app.post('/products',function(req,res){ 
    fs.readFile('products.json','utf8',function(err,data){ 
     var result = JSON.parse(data); 
     var productName = req.body.name; 
     console.log(req.body.name); 
     currentId++; 
     var productId = currentId; 
     var product = { 
      name: productName, 
      id: productId 
     } 
     result.products.push(product); 
     fs.writeFile(__dirname + "/products.json",JSON.stringify(result),'utf8'); 
    }); 
    res.send("post done"); 
}); 
:ここで

コードであります

これはコードの重要な部分です。res.sendの最後で動作し、失敗します。

+0

を追加してください? – Wex

+0

私はこの小さなアプリケーションのためにそれを必要としないので、私はそれを直接行っています、ルートはありません –

+1

あなたの変数 'app'はどのようなインスタンスですか? – Wex

答えて

0

あなたのクライアントコードは、JSONレスポンスを探しているが、あなたは、文字列を返しています。

$("#create-form").on('submit',function(){ 
    event.preventDefault(); 
    var createIn = $("#create-input").val(); 
    $.ajax({ 
     url: '/products', 
     method:'POST', 
     data:JSON.stringify({name:createIn}), 
     contentType: "application/json", 
     dataType: "json",   <-------------- 
     success: function(data){ 
      console.log(data); 
      $("create-input").val(""); 
      $("get-button").click(); 
     } 
    }); 
}) 

この行を削除したり、ルーティングのためにどのようなノードのライブラリを使用しているサーバー側で

res.send({"message":"post done"}); 
+0

答えに感謝しています。答えを送るが、それは成功ajaxで続行し、成功の3行を行う必要がありますか? –

+0

worketdは、他のものに焦点を当てて、メインを忘れて、私は2行のIDを忘れて、それは動作しませんが、問題がデータ型であった前に、非常に大きな目をありがとう:) –

0

これはあなたの質問に直接答えませんが、作業が完了し、エラーを処理する必要があることがわかるまで、応答を返信しないことが理想的です。つまり、コールバックを使用する必要があります。 (あまりにも多くのコールバックが問題になることができますし、他のパターンを調査する必要がある - などの約束を - ここに必要ビットない)

+1

これは明らかにrouteHandlerを書く良い方法ですが、彼の問題は 'res.send' – Wex

+0

あなたは 'fs.readFileSync'と' fs.writeFileSync'を使ってそれを同期させることもできます –

+0

私はエラーを処理する方法を知っています、事はそれです –

関連する問題