0

我在 localhost:3000/#!/ 上运行我的应用程序,并尝试获取用于 Express 的 URL 参数,但没有运气。我创建了一个新的服务器路由文件,其中包含以下内容:

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 请求来更新填充的值。这两个请求都可以正常工作。

问题是当我尝试使用带有 foo 参数的 URL 访问我的应用程序时,如下所示http://localhost:3000/#!/admin/test?foo=bar:我已经在我的代码中尝试了上述三种尝试中的每一种(将其他尝试注释掉,以便我可以一一尝试),但似乎无法获得变量。

在我的 admin.server.controller 文件中,除了填充和更新功能之外,我还拥有以下代码:

admin.server.controller

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

使用这些努力,我实际上并没有能够证明我已经成功地“抓住”了 foo 以供服务器端使用。我错过了什么?

4

2 回答 2

2

在你的

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

所有 hashbang url 都由 angularjs 处理,这/admin/test?foo=bar不会被视为请求。要在您的请求中添加查询字符串,您可以在 angularjs 资源中这样做:

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

这将表示为http://localhost:3000/admin/test?foo=bar

您的问题主要取决于您如何在客户端发送请求。

顺便说一句,在您的快速路由中,您可以像这样获得 foo 值:Pre-routing with querystrings with Express in Node JS

如果您想获取查询字符串并在请求中使用它,请参阅:如何在 JavaScript 中获取查询字符串值?

于 2014-12-10T16:15:47.287 回答
1

URL 的格式为<protocol>://<hostname>?<query string>#<fragment>

在第一个 # 之后(包括)的 URL 的任何部分都被视为片段。片段仅用于客户端(在本例中为浏览器),服务器通常不使用。

来自RFC 3986 的第 3.5 节 - 统一资源标识符 (URI):通用语法:

片段标识符在信息检索系统中作为客户端间接引用的主要形式具有特殊的作用,它允许作者专门识别仅由资源所有者间接提供的现有资源的各个方面。因此,片段标识符不用于 URI 的特定于方案的处理;相反,片段标识符在解引用之前与 URI 的其余部分分开,因此片段本身的标识信息仅由用户代理解引用,而与 URI 方案无关。

传统上,片段用于链接到同一页面上的锚点。一个很好的例子是上面提供的 RFC 页面链接,它将跳转到第3.5 节。在浏览器中自动分片。

该部分的 URL 是https://www.rfc-editor.org/rfc/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,利用了 Fragments;它们用于服务器的事实;以及它们包含在浏览器历史堆栈中的事实;作为在客户端引用资源的一种方式,例如使用客户端路由系统。

(旁白:#!已经成为在客户端应用程序中表示路由的流行习语。这可能与#!基于 *nix 的可执行脚本中使用的标头有关(语法上但不是技术上)。这些通常后面是指向解释器的路径脚本。例如#!/bin/bash。)

所以在 URIhttp://localhost:3000/#!/admin/test?foo=bar中,段?foo=bar#表示片段之后,因此被定义为片段的一部分而不是查询字符串。远程资源的查询字符串应始终在片段之前定义。例如:

http://localhost:3000/admin/test?foo=bar#!/route/in/angularjs
于 2014-12-10T17:38:22.577 回答