MEANJS Получить параметры URL

Я запускаю свое приложение на локальном хосте: 3000/#!/ и безуспешно пытаюсь получить параметры URL для использования с Express. Я создал новый файл маршрутизации сервера, который содержит следующее:

admin.server.routes.js

'use strict';

module.exports = function(app) {
    // Admin Routes
    var admin = require('../../app/controllers/admin.server.controller');

    // Both of these routes work fine.
    app.route('/admin/test').
        get(admin.populate).
        put(admin.update);

    // First attempt, didn't work.
    app.route('/admin/test').get(admin.doSomething);

    // Second attempt, didn't work.
    app.param('foo', admin.doSomething);

    // Third attempt, didn't work.
    app.param('foo', function(req, res) {
        console.log('Found foo!');
        return res.status(400).send();
    });

};

На моей странице администратора мой admin.client.controller.js отправляет запрос $http.get при загрузке для заполнения данных. У меня есть форма с кнопкой, которая отправляет запрос $http.put для обновления заполненных значений. Оба эти запроса работают нормально.

Проблема возникает, когда я пытаюсь посетить свое приложение, используя URL-адрес с параметром foo, например: http://localhost:3000/#!/admin/test?foo=bar. Я пробовал каждую из трех попыток, отмеченных выше, в своем коде (закомментировав остальные, чтобы я мог попробовать их одну за другой), но, похоже, не могу получить переменную.

В моем файле admin.server.controller, в дополнение к функциям заполнения и обновления, у меня есть просто этот код:

admin.server.controller

exports.doSomething = function(req, res) {
    console.log('Server - found foo!');
};

Не используя ни одного из этих усилий, я действительно смог продемонстрировать, что успешно "схватил" foo для использования на стороне сервера. Что мне не хватает?


person aikorei    schedule 10.12.2014    source источник


Ответы (2)


В твоем

http://localhost:3000/#!/admin/test?foo=bar

все URL-адреса hashbang обрабатываются angularjs, этот /admin/test?foo=bar не будет рассматриваться как запрос. Чтобы добавить строку запроса в свой запрос, вы можете сделать это следующим образом в ресурсе angularjs:

 function ($resource) {
     $resource('/admin/test').query({foo: 'bar'});
 }

Это будет выражено как http://localhost:3000/admin/test?foo=bar

Ваша проблема в основном зависит от того, как вы отправляете запрос на стороне клиента.

Кстати, в ваших экспресс-маршрутах вы можете получить значение foo следующим образом: js/14909941#14909941">Предварительная маршрутизация строк запросов с помощью Express в Node JS

Если вы хотите получить строку запроса и использовать ее в своем запросе, обратитесь к этому: Как я могу получить значения строки запроса в JavaScript?

person Carlo Gonzales    schedule 10.12.2014
comment
Спасибо за ответ, Карло. Я не понимал, что Angular не позволит Node/Express получить параметры в строке. Я изменил свой URL-адрес запроса только на localhost:3000/admin/test?foo=bar, и он работал правильно, ничего не меняя (я получил сообщение сервера, как и ожидалось). Я очень ценю понимание! - person aikorei; 10.12.2014
comment
Кроме того, просто чтобы закрыть это, как только моя функция doSomething была вызвана, я смог получить значения параметров, используя: var q = req.query; console.log('Query values are: '); console.dir(q); или напрямую используя var foo = req.query.foo; console.log('Foo value is '); console.dir(foo); - person aikorei; 10.12.2014

URL-адрес имеет форму <protocol>://<hostname>?<query string>#<fragment>.

Любая часть URL-адреса после (и включая) первого символа # считается фрагментом. Фрагменты используются только клиентом (в данном случае браузером) и обычно не используются сервером.

Из раздела 3.5 RFC 3986 — Единый идентификатор ресурса (URI): Общий синтаксис:

Идентификаторы фрагментов играют особую роль в информационно-поисковых системах как основная форма косвенных ссылок на стороне клиента, позволяя автору конкретно идентифицировать аспекты существующего ресурса, которые лишь косвенно предоставляются владельцем ресурса. Таким образом, идентификатор фрагмента не используется в специфичной для схемы обработке URI; вместо этого идентификатор фрагмента отделяется от остальной части URI до разыменования, и, таким образом, идентифицирующая информация внутри самого фрагмента разыменовывается исключительно агентом пользователя, независимо от схемы URI.

Традиционно фрагменты используются для ссылки на якоря на той же странице. Хорошим примером является приведенная выше ссылка на страницу RFC, по которой вы перейдете к разделу 3.5. Фрагментировать автоматически в браузере.

URL-адрес раздела — https://tools.ietf.org/html/rfc3986#section-3.5, поэтому фрагмент — section-3.5. В HTML для страницы есть якорь внутри <h3>, обозначающий раздел с:

<a class="selflink" name="section-3.5" href="#section-3.5">3.5</a>    

Интересным здесь является свойство name, которое называет якорь, позволяя браузеру идентифицировать его и переходить к нему, потому что оно соответствует значению, запрошенному фрагментом. По сути, якорь является «вторичным ресурсом» на стороне клиента, который запрашивается URI.

Клиентские javascript-приложения и фреймворки, такие как angularjs, используют преимущества фрагментов; тот факт, что они не предназначены для использования на сервере; и тот факт, что они включены в стек истории браузера; как способ ссылки на ресурсы на стороне клиента, например, для использования системы маршрутизации на стороне клиента.

(Кроме того: #! стало популярной идиомой для обозначения маршрутов в клиентских приложениях. Возможно, это связано (грамматически, но не технически) с заголовком #!, используемым в исполняемых сценариях на основе * nix. Обычно за ними следует путь к интерпретатору. для скрипта.Например #!/bin/bash.)

Таким образом, в URI http://localhost:3000/#!/admin/test?foo=bar сегмент ?foo=bar находится после #, обозначающего фрагмент, и поэтому определяется как часть фрагмента, а не строки запроса. Строка запроса для удаленного ресурса всегда должна быть определена перед фрагментом. Например:

http://localhost:3000/admin/test?foo=bar#!/route/in/angularjs
person Darren Gordon    schedule 10.12.2014