2016-08-01 3 views
0

Ich bekomme ein wirklich seltsames Anfrage Problem mit Angular und Node, und ich kann nichts darüber finden.

Ich habe einen Angular Controller, der anfänglich Daten abruft und in $ scope legt, was dann auch eine Funktion hat, die es dem Controller ermöglicht, die Daten auf dem Knotenserver zu POST zu bringen. Nach der Aktualisierung sendet der Server das aktualisierte Dokument.

Die erste Aktualisierung (POST) Anfrage funktioniert einwandfrei, und die Daten werden korrekt zurückgegeben. Alle nachfolgenden Anfragen bleiben jedoch in "Ausstehend" (Anzeige in Chrome Dev Tools) hängen. Sie schlagen dann nach ~ 2 Minuten mit einem Fehler in der Konsole net::ERR_EMPTY_RESPONSE fehl. Nur nach dem Scheitern werden sie in der Node-Konsole angezeigt, aber erscheinen als: POST /api/document/update?m=0.6154590881151583 - - ms -
wo diese 's spiegeln den Statuscode, die Größe der Anfrage und die Zeit verwendet, um zu reagieren.

Winkelregler:

pushToServer = function() { 
$http.post('/api/document/update',{ 
    letter : $scope.document, 
    }).then(function successCallback(res){ 
    console.log("all good" + JSON.stringify(res.data,null,3)); 
    $scope.document= res.data[0]; 
    }, function errorCallback(res){ 
    console.log("arg " + res); 
    }); 
} 

Node (Express) Teil

app.post('/api/document/update', function(req, res) { 
    var letterParsed = req.body.letter; 

    Documents.findOneAndUpdate(
     { issueId: letterParsed.issueId }, 
     { letterParsed }, 
     { upsert: true }, 
     function(err, doc) { 
      if (err) throw err; 
     }); 

    //FROM http://stackoverflow.com/a/38534012/1224973 
    let rowQueries = []; 
    letterParsed.rows.forEach(row => { 
     var query = Documents.findOneAndUpdate(
      { 
      partId: letterParsed.partId, 
      'rows.$._id': row._id 
      }, { 
      $addToSet: { 
       'rows': row 
      } 
      }, { 
      upsert: true 
     }); 
     rowQueries.push(query.exec()); 
    }); 

    Promise.all(rowQueries).then(updatedDocs => { 

     Documents.find({ partId: letterParsed.partId }, 
     function(err, doc) { 
      if (err) { res.send(err); } 
      res.json(doc) 
     } 
    ); 

    }); 
}); 

EDIT: Auch hier ist meine Express-Konfiguration:

app.use(morgan('dev')); 
app.use(bodyParser.json());          
app.use(bodyParser.urlencoded({extended: true}));    
app.use(bodyParser.text()); 
app.use(bodyParser.json({ type: 'application/vnd.api+json'})); 
app.use(methodOverride('X-HTTP-Method-Override')); 
+1

Haben Sie versucht, '.catch()' zu Ihrer Versprechenskette mit einer Konsolenausgabe hinzuzufügen? Die Callback-Funktion nimmt 1 Argument mit dem enthaltenen Fehler. Um solche Probleme zu vermeiden, müssen Sie jede Versprechungskette aufspüren und den Client wissen lassen, was passiert ist (ein einfacher Anforderungscode von 500 sagt Ihnen, wo er fehlgeschlagen ist). Wie so 'Promise.all (...). Dann (...). Catch (function (err) {res.status (500) .json ({error: err}});'. Bitte nicht detailliert zurückkommen Fehler in der Produktion! –

+0

Leider hat dies nicht geholfen, aber das ist toll zu beachten, aber danke! –

+0

Der Grund für das Einfrieren des Clients ist, weil die zweite Anfrage abstürzt und keine Antwort vom Server gesendet wird (rejected/irriges Versprechen, uncaught Ausnahme etc ...) –

Antwort

1

ich denke, die ' Document.find 'Teil könnte das Problem sein. Wenn Sie einen Fehler haben, sendet er einen Fehler und versucht dann, doc zu senden, aber Sie können keine zwei Antworten senden. Wechseln Sie einfach zu:

Documents.find({partId: letterParsed.partId},function(err, doc) { 
    if (err) { 
     return res.send(err); 
    } 
    res.json(doc) 
}); 
+0

Keine Lösung, aber ich sollte das auf jeden Fall für Best Practice tun, danke. –

+0

Nicht benötigt, wenn Sie Versprechungen verwenden. Sie '.catch()' die Fehler stattdessen. –

Verwandte Themen