/ / express router.param przy użyciu tablicy nazw - javascript, express

express router.param używając tablicy nazw - javascript, express

Próbuję zainicjować wiele parametrów ekspresowego routera za pomocą metody router.param. Oto fragment kodu routera:

var express = require("express");
var router = express.Router();

router.get("/", function(req, res) {
res.render("index", { title: "Express" });
});

router.param(["foo","bar"], function(req,res,next,foo,bar){
req.myvars = {
foo: foo,
bar: bar
};
console.log("initialized params: foo==%s, bar==%s", foo, bar);
return next();
});

router.get("/myvars/:foo/:bar",function(req,res,next){
var foo = req.myvars.foo;
var bar = req.myvars.bar;
console.log("router.get: foo==%s, bar==%s", foo, bar);
res.json(req.myvars);
});

module.exports = router;

Podczas przeglądania do pojawia się błąd http://localhost:3000/myvars/a/b: Nie można odczytać właściwości „foo” niezdefiniowanej. Tak samo robi moje okno konsoli nie pokaż „zainicjowane parametry”, jak się spodziewałem. Czy router.param nie jest wywoływany? Jak prawidłowo korzystać z metody router.param? Widzę wiele przykładów online (na przykład. Przykład interfejsu API używania router.param tylko z pojedynczy nazwa: czy ktoś mógłby podać kodowy przykład użycia router.param z tablica nazw?

Jeśli to konieczne, oto zależności mojego pakietu.json.

"dependencies": {
"express": "~4.8.6",
"body-parser": "~1.6.6",
"cookie-parser": "~1.3.2",
"morgan": "~1.2.3",
"serve-favicon": "~2.0.1",
"debug": "~1.0.4",
"jade": "~1.5.0"
}

Odpowiedzi:

2 dla odpowiedzi № 1

Patrząc na kod routera Express, w rzeczywistości nie akceptuje tablicy nazw (nawet jeśli dokumentacja to sugeruje).

Możesz obejść to przy pomocy czegoś takiego:

var handler = function(req, res, next, value, key) {
req.myvars = req.myvars || {};
req.myvars[key] = value;
next();
};

router.param("foo", handler);
router.param("bar", handler);

0 dla odpowiedzi nr 2

Cóż, obsługuje tablice, ale nie możesz rozwiązać obu parametrów jednocześnie. Jeśli ponownie spojrzysz na dokumenty.

router.param(["id", "page"], function (req, res, next, value) {
console.log("CALLED ONLY ONCE with", value);
next();
})

Musisz uzyskać dostęp do ich wartości dla każdego stylu. Również nie wiem, dlaczego miałbyś zwrócić next(). Nie sądzę, że spowoduje to jakiekolwiek problemy, ale po prostu zadzwoń next() i niech funkcja zakończy się sama.