express.js не знает название переменной, которую вы передаете, потому что это веб-сервер, который прослушивает некоторые адреса.
В вашем случае первый маршрут говорит:
Если кто-то идет на /api/admin/elements/{{whatever}}
вызова функция elements.getElementsByType()
и назначить независимо переменной type
Второй маршрут говорит то же самое, просто позвонить другому и назначьте значение var _id
.
Возможное решение иметь два различных маршрута:
app.get('/api/admin/elements/type/:type', elements.getElementsByType);
app.get('/api/admin/elements/id/:_id', elements.getElement);
Другим возможным решением, если вы уверены, что id
является всегдаint
и type
является никогда ИНТ назвать только один функции и выберите, что делать, проверяя тип параметра:
app.get('/api/admin/elements/:value', elements.getElementsByType);
getElementsByType : function(req, res) {
if (isNaN(req.params.value)) {
// this is a type
} else {
//this is an id
}
Но я хочу повысить Важно, чтобы вы поняли, почему ваш пример не работает.
Я не могу объяснить, как веб работает только один ответ, но позвольте мне подчеркнуть некоторые вещи:
express.js слушает на сервере, чтобы запросить к port, как webserver. Вы можете сказать express.js, какие маршруты вы хотите прослушать: все маршруты, которые не указаны, будут отвечать 404 (или 405, если вы попросите метод, который не существует на ресурсе, который существует, например POST на /api/admin/elements/{{whatever}}
в ваш пример).
Таким образом, при указании маршрута, у вас есть два компонента:
неподвижную часть, которая является адресом, и это всегда то же самое (как /api/admin/elements/
), а часть, какое значение может измениться.
Вы говорите, что express.js, часть которого может измениться с использованием обозначения :
. Для express.js все, что находится в URL-адресе между /:
и следующим /
, должно быть передано в объекте req.params
с указанным вами именем.
Давайте сделаем несколько примеров:
/a/:a/b/:b/c/:c
Этот адрес будет ответ на каждый вызов, который вы делаете для `/ а/{{param1}}/B/{{param2}}/C/{{Param3} }
Таким образом, вы будете иметь req.params
объект с этими 3 значения:
req.param = {
a: 'param1',
b: 'param2',
c: 'param3',
}
Вам не нравится в, б и c как имена? Я тоже, так что не давайте изменим, что:
/a/:artemis/b/:betelgeuse/c/:cassidy
Тогда req.params объект будет:
req.param = {
artemis: 'param1',
betelgeuse: 'param2',
cassidy: 'param3',
}
Но express.js это то же самое, он не может выбрать то, что это основываясь только на значении.
Теперь пример немного сложнее:
, если у вас есть
/a/:a
и /a/b
для express.js может быть немного запутанным (но также и для тех, кто использует свои API-интерфейсы, так пожалуйста, не сделайте это).
Теперь, как это работает, зависит от порядка, который вы указали в маршрутах.
Если вы сделали /a/:a
, а затем /a/b
, функция, связанная с /a/b
, никогда не будет называться. express.js запрашивает адрес и проверяет каждый маршрут, если он имеет совпадение. Поэтому, если вы звоните /a/b
express.js находит /a/:a
(это означает an /a/ and a thing after this
и считает, что b
является допустимым значением для переменной a
).
Но если вы объявляете /a/b
перед /a/:a
express.js достигнет до /a/b
(это означает, что маршрут, который точно /a/b
), то это будет соответствовать первой.
О, мой бог, куча слов: < –
Спасибо, первое решение идеально подходит – Mohamed
Отличный подробный ответ – Mohamed