Mit nodejs und express möchte ich ein oder mehrere Objekte (Array) mit JSON zurückgeben. Im folgenden Code gebe ich jeweils ein JSON-Objekt aus. Es funktioniert, aber das ist nicht genau das, was ich will. Die erzeugte Antwort ist keine gültige JSON-Antwort, da ich viele Objekte habe.
Mir ist klar, dass ich einfach alle Objekte zu einem Array hinzufügen und dieses bestimmte Array in res.end zurückgeben kann. Ich befürchte jedoch, dass dies schwer zu verarbeiten und speicherintensiv werden könnte.
Was ist der richtige Weg, um dies mit nodejs zu erreichen? Ist query.each die richtige Methode zum Aufrufen?
app.get('/users/:email/messages/unread', function(req, res, next) {
var query = MessageInfo
.find({ $and: [ { 'email': req.params.email }, { 'hasBeenRead': false } ] });
res.writeHead(200, { 'Content-Type': 'application/json' });
query.each(function(err, msg) {
if (msg) {
res.write(JSON.stringify({ msgId: msg.fileName }));
} else {
res.end();
}
});
});
res.write(JSON.stringify(foo))
. Wenn esfoo
groß ist, müssen Sie es möglicherweise zerhacken (stringifizieren, dann Stück für Stück schreiben). Wahrscheinlich möchten Sie auch Ihren Header"Content-Type":"application/json"
oder ähnliches nach Bedarf sehen.Ich weiß nicht, ob dies wirklich anders ist, aber anstatt über den Abfragecursor zu iterieren, können Sie Folgendes tun:
quelle
[Bearbeiten] Nachdem Sie die Mongoose-Dokumentation überprüft haben, können Sie jedes Abfrageergebnis als separaten Block senden. Der Webserver verwendet Transfer - Codierung chunked standardmäßig so alles , was Sie tun müssen , ist ein Array wickeln sich um die Elemente es ein gültiges JSON - Objekt zu machen.
Grob (ungetestet):
Alternativ können Sie, wie Sie bereits erwähnt haben, den Array-Inhalt einfach so senden, wie er ist. In diesem Fall wird der Antworttext sofort gepuffert und gesendet, wodurch möglicherweise eine große Menge zusätzlichen Speichers (über dem zum Speichern der Ergebnisse selbst erforderlichen Wert) für große Ergebnismengen verbraucht wird. Beispielsweise:
quelle