我在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参数的网址访问我的应用时,如下所示:http://localhost:3000/#!/admin/test?foo=bar
。我已经在我的代码中尝试了上面提到的三次尝试中的每一种(将其他尝试注释掉,以便我可以逐个尝试),但似乎无法获得变量。
在我的admin.server.controller文件中,除了populate和update函数之外,我只需要这段代码:
admin.server.controller
exports.doSomething = function(req, res) {
console.log('Server - found foo!');
};
我没有使用这些努力,实际上我已经能够证明我已成功“抓住”foo用于服务器端使用。我错过了什么?
答案 0 :(得分:2)
在你的
中http://localhost:3000/#!/admin/test?foo=bar
所有hashbang网址都由angularjs处理,此/admin/test?foo=bar
不会被视为请求。要在请求中添加查询字符串,您可以在angularjs resource中执行此操作:
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
如果您想获取查询字符串并在请求中使用它,请参阅:How can I get query string values in JavaScript?
答案 1 :(得分:1)
网址格式为<protocol>://<hostname>?<query string>#<fragment>
。
第一个#之后(包括)的URL的任何部分都被视为片段。片段仅在客户端上使用(在本例中为浏览器),通常不由服务器使用。
来自RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax:
的第3.5节片段标识符在信息检索系统中具有特殊作用,作为客户端间接引用的主要形式,允许作者专门识别仅由资源所有者间接提供的现有资源的各个方面。因此,片段标识符不用于URI的特定于方案的处理;相反,片段标识符在取消引用之前与URI的其余部分分开,因此片段本身内的标识信息仅由用户代理解除引用,而不管URI方案如何。
传统上,片段用于链接到同一页面上的锚点。一个很好的例子是上面提供给RFC页面的链接,它将跳转到 3.5部分。在您的浏览器中自动分段。
该部分的网址为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