2016-08-07 2 views
0

У меня есть следующие маршруты Node.js ЭкспрессNode.js многодисковый получить функции с различными параметрами

app.get('/api/admin/elements/:type', elements.getElementsByType); 
app.get('/api/admin/elements/:_id', elements.getElement); 

элементы Funtions являются:

getElementsByType : function(req, res) { 
element.find({ 
    type : req.params.type 
}, function(err, elements) { 
    if (err) { 
    return err; 
    } 
    res.json(elements); 
}); 
}, 
getElement : function(req, res) { 
var file = "/thatulborooj-data/elements/" + req.params._id + ".json"; 
jsonfile.readFile(file, function(err, obj) { 
    if (err) { 
    res.json([]); 
    } else { 
    res.json(JSON.parse(obj)); 
    } 
}); 
} 

, когда я все $http.get('/api/admin/elements/' + scope.element._id) сюда angularJS всегда все первый раз, как я могу сделать разницу между ними или установить тип параметра

ответ

3

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), то это будет соответствовать первой.

+0

О, мой бог, куча слов: < –

+0

Спасибо, первое решение идеально подходит – Mohamed

+0

Отличный подробный ответ – Mohamed

2

Предполагая, что _id должен совпадать с ObjectId, вы можете сделать обработчик маршрута явно совпадают:

app.get('/api/admin/elements/:_id([a-f0-9]{24})', elements.getElement); 
app.get('/api/admin/elements/:type', elements.getElementsByType); 

Просто убедитесь, что _id маршрут объявлен до того (более общий) type маршрута.

Предостережение: это прерывается, если вы используете типы, соответствующие объекту ObjectId.