Ich bin gerade mit Node/Express. Ich versuche eine einfache REST-API zu erstellen und ich frage mich, wie ich mit diesem Dilemma umgehen soll.Schreiben Middleware, die Agnostisch ist, wo es auf dem Stapel ist
Sagen, ich habe einen Controller eine Anforderung Aufnehmen (nach der Authentifizierung/andere Middleware-Komponenten ihre Sache getan haben), das ruft eine Modellfunktion, einige Daten zu erhalten, wie folgt aus:
module.exports = function (router) {
router.get('/api/resource1', a_model.get_all);
};
Die Definition für das Modell wäre so etwas wie:
exports.get_all = function (req, res, next) {
db.any('select * from resource_table')
.then(function (data) {
res.status(200).json({
status: 'success',
data: data,
message: 'Retrieved all the things.'
});
})
.catch(function (err) {
return next(err);
});
};
aber jetzt können sagen, dass ich einen anderen Controller haben, der muss mit den Daten einige andere Sachen zu tun, dass die Modell-Funktion aufrufen, sondern auch muss auch. Z.B.
module.exports = function (router) {
router.get('/api/resource2', a_model.get_all, do_stuff_with_data);
};
Der aktuelle Stand der a_model.get_all
wird nicht zulassen, do_stuff_with_data
zu „Dinge tun“, weil es nie next()
nennt.
Das Problem ist, dass, wenn ich es nur next()
machen nennen, nachdem es res
mutiert, erhalte ich eine Fehlermeldung, die besagt: Error: Can't set headers after they are sent
wenn ich /api/resource1
getroffen.
Ich habe versucht, if (next) { next(); }
, aber das funktioniert auch nicht, weil es immer die Fehler anfallende Middleware am unteren Rand des Stapels ist.
Eine mögliche Lösung wäre, am Ende meiner Middleware-Ketten eine Funktion zu platzieren, die einem NOP
entspricht, so dass meine Module immer next()
anrufen können, aber es muss einen besseren Weg geben, oder?
Gah! Meine Verwirrung kam von einem Missverständnis dessen, was res.json() tat. Ich wusste nicht, dass es tatsächlich die Antwort gesendet hat. Das macht jetzt vollkommen Sinn, danke! (Ich war immer verwirrt darüber, was tatsächlich die Antwort gesendet hat. Lol. Ich dachte, es könnte eine Middleware gewesen sein, die für mich am Ende der Anrufkette angehängt ist.) – LukeP