Przede wszystkim trasa w ekspresie to oprogramowanie pośrednie zdefiniowane w connect. Różnica między ramkami ekspresowymi i innymi polega na tym, że oprogramowanie pośrednie zwykle znajduje się przed kontrolerem, a kontroler kończy reakcję. Innym powodem, dla którego ekspresowe używa oprogramowania pośredniego, jest natura asynchroniczna Node.js.
Pozwala zobaczyć, jak kontroler może wyglądać w JavaScript.
var Controller = function() { };
Controller.prototype.get = function (req, res) {
find(req.param.id, function (product) {
res.locals.product = product;
find(res.session.user, function (user) {
res.locals.user = user;
res.render('product');
});
});
};
Pierwszą rzeczą, którą prawdopodobnie zauważasz na temat tego działania get, są zagnieżdżone wywołania zwrotne. Jest to trudne do przetestowania, trudne do odczytania i jeśli musisz edytować rzeczy, które musisz skrzypnąć z wcięciem. Więc pozwala to naprawić za pomocą kontroli przepływu i uczynić ją płaską.
var Controller = function() { };
Controller.prototype.update = function (req, res) {
var stack = [
function (callback) {
find(req.param.id, function (product) {
res.locals.product = product;
callback();
});
},
function (callback) {
find(res.session.user, function (user) {
res.locals.user = user;
callback();
});
}
];
control_flow(stack, function (err, result) {
res.render('product');
});
}
W tym przykładzie można wyodrębnić wszystkie różne funkcje stosu i przetestować je lub nawet ponownie wykorzystać je do różnych trasach. Być może zauważyłeś, że struktura przepływu sterowania wygląda podobnie do warstwy pośredniej. Więc zamień stos z oprogramowaniem pośredniczącym na naszej trasie.
app.get('/',
function (req, res, next) {
find(req.param.id, function (product) {
res.locals.product = product;
next();
});
},
function (req, res, next) {
find(res.session.user, function (user) {
res.locals.user = user;
next();
});
},
function (req, res, next) {
res.render('product');
}
);
Tak więc może to być technicznie możliwe, aby kontrolery w express.js byś prawdopodobnie zmuszony do użycia struktur sterowania przepływem, który w końcu jest taka sama jak middleware.