2016-12-10 5 views
1

Ich arbeite mit einer einfachen CRUD-App mit jquery ajax und node.js, nur um meine Fähigkeiten mit Knoten und Ajax zu verbessern. Die Sache ist, dass ich eine Post-Anfrage mache, die mit meinem Post-Router auf dem Node-Server gehandhabt wird, und alles funktioniert gut. Es fügt ein weiteres Produkt zu meiner products.json Datei hinzu, aber am Ende wird die Antwort nicht an den Client zurückgeschickt, der letzte res.send ("done") funktioniert nicht und ich weiß nicht warum. .res.send funktioniert nicht richtig

hier ist der Code:

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(); 
     } 
    }); 
}) 

Knoten

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"); 
}); 

Dies ist nur der wichtige Teil des Codes, es funktioniert und scheitert nur am Ende in der res.send.

+0

Welche Knoten-Bibliothek verwenden Sie für das Routing? – Wex

+0

Ich mache es direkt, keine Routen, weil ich es nicht für diese kleine Anwendung brauche –

+1

Was ist Ihre Variable 'app' eine Instanz von? – Wex

Antwort

0

Ihr Client-Code ist auf der Suche nach einem json Antwort, aber Sie sind wieder einen String.

$("#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(); 
     } 
    }); 
}) 

Entweder diese Zeile löschen oder auf der Serverseite hinzufügen

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

danke für die Antwort, jetzt bekomme ich die res.Antwort senden, aber sollte es nicht weiter auf den Erfolg AJAX und machen Sie die 3 Zeilen auf den Erfolg? –

+0

worketd, war auf andere Dinge konzentriert und vergessen Sie das Haupt, ich vergesse die ID auf den 2 Zeilen OFC es funktioniert nicht, aber bevor das Problem mit dem Dateityp war, vielen Dank, sehr gutes Auge :) –

0

Dies beantwortet Ihre Frage nicht direkt, aber Sie sollten die Antwort im Idealfall nicht zurücksenden, bis Sie wissen, dass die Arbeit erledigt wurde und Sie Fehler behandeln sollten. Mit anderen Worten, Sie sollten die Rückrufe verwenden. (Zu viele Rückrufe kann problematisch sein, und Sie sollten andere Muster untersuchen - zB Versprechungen - Bit keine Notwendigkeit, hier)

+1

Dies ist eindeutig ein besserer Weg, den routeHandler zu schreiben, aber ich habe das Gefühl, wenn sein Problem ist, dass der 'res.send' ist keine Antwort zurück an den Client, dass dies sein Problem nicht lösen wird – Wex

+0

Sie können auch tun 'fs.readFileSync' und' fs.writeFileSync', um es synchron zu machen –

+0

richtig, ich weiß, wie man mit den Fehlern umgehen, die Sache ist, dass Ich bekomme keinen Fehler, mein Server reagiert einfach nicht. –