Chr*_*ams 441 url node.js express
假设我的样本网址是
我说我有以下路线
app.get('/one/two', function (req, res) {
var url = req.url;
}
Run Code Online (Sandbox Code Playgroud)
价值url将是/one/two.
如何在Express中获取完整的URL?例如,在上面的情况下,我想收到http://example.com/one/two.
Pet*_*ons 678
该协议可用作req.protocol.这里的文档
http除非您看到req.get('X-Forwarded-Protocol')已设置且具有值https,在这种情况下您知道这是您的协议主持人来自req.get('host')Gopal指出
希望您的URL中不需要非标准端口,但如果您确实需要了解它,那么您将在应用程序状态中拥有它,因为它是您app.listen在服务器启动时传递给的任何内容.但是,在非标准端口上进行本地开发的情况下,Chrome似乎在主机头中包含端口,因此req.get('host')返回localhost:3000.因此,至少对于标准端口上的生产站点并直接浏览到您的快速应用程序(没有反向代理)的情况,host标题似乎对URL中的端口做了正确的事情.
路径来自req.originalUrl(感谢@pgrassant).请注意,此DOES包含查询字符串.这里有关于req.url和req.originalUrl的文档.根据您打算对URL执行的操作,与之originalUrl相比,可能是也可能不是正确的值req.url.
将这些组合在一起以重建绝对URL.
var fullUrl = req.protocol + '://' + req.get('host') + req.originalUrl;
Run Code Online (Sandbox Code Playgroud)
Mic*_*bel 115
您可以使用node.js API来表示URL并URL.format()从express 传递信息,而不是自己将事物连接在一起.
例:
var url = require('url');
function fullUrl(req) {
return url.format({
protocol: req.protocol,
host: req.get('host'),
pathname: req.originalUrl
});
}
Run Code Online (Sandbox Code Playgroud)
Nis*_*hah 49
2022年
上面的答案工作正常,但不是文档的首选,因为url.parse现在是这样legacy,new URL()所以如果您想更好地控制url.
您可以Full URL从下面的代码中获取。
`${req.protocol}://${req.get('host')}${req.originalUrl}`
Run Code Online (Sandbox Code Playgroud)
示例 URL:http://localhost:5000/a/b/c?d=true&e=true#f=false
固定属性(您将在所有路线中获得相同的结果)
`${req.protocol}://${req.get('host')}${req.originalUrl}`
Run Code Online (Sandbox Code Playgroud)
不固定的属性(每条路线都会改变,因为它是由快递本身控制的)
路线:/
req.baseUrl: <blank>
req.url: /a/b/c?d=true&e=true
req.path: /a/b/c
Run Code Online (Sandbox Code Playgroud)
路线/a
req.baseUrl: /a
req.url: /b/c?d=true&e=true
req.path: /b/c
Run Code Online (Sandbox Code Playgroud)
文档: http: //expressjs.com/en/api.html#req.baseUrl
在该URL函数中,您将在每条路线中获得相同的结果,因此属性始终是固定的。
特性
req.protocol: http
req.hostname: localhost
req.get('Host'): localhost:5000
req.originalUrl: /a/b/c?d=true&e=true
req.query: { d: 'true', e: 'true' }
Run Code Online (Sandbox Code Playgroud)
您将得到如下结果。我根据图像更改了属性的顺序,以便它可以匹配图像流。
URL {
href: 'http://localhost:5000/a/b/c?d=true&e=true',
protocol: 'http:',
username: '',
password: '',
hostname: 'localhost',
port: '5000',
host: 'localhost:5000',
origin: 'http://localhost:5000',
pathname: '/a/b/c',
search: '?d=true&e=true',
searchParams: URLSearchParams { 'd' => 'true', 'e' => 'true' },
hash: ''
}
Run Code Online (Sandbox Code Playgroud)
注意:Hash无法发送到服务器,因为它像Fragment在服务器中一样处理,但您会在客户端手段浏览器中得到它。
文档: https: //nodejs.org/api/url.html#url_new_url_input_base
cho*_*ovy 35
我发现它有点像PITA来获取请求的URL.我不敢相信快递没有更简单的方法.应该是req.requested_url
但这是我如何设置它:
var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + '://' + req.host + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;
Run Code Online (Sandbox Code Playgroud)
mpo*_*lci 17
使用url.format:
var url = require('url');
Run Code Online (Sandbox Code Playgroud)
这支持所有协议并包括端口号.如果您的originalUrl中没有查询字符串,则可以使用此更干净的解决方案:
var requrl = url.format({
protocol: req.protocol,
host: req.get('host'),
pathname: req.originalUrl,
});
Run Code Online (Sandbox Code Playgroud)
如果您有查询字符串:
var urlobj = url.parse(req.originalUrl);
urlobj.protocol = req.protocol;
urlobj.host = req.get('host');
var requrl = url.format(urlobj);
Run Code Online (Sandbox Code Playgroud)
los*_*ion 15
这是添加可以在req对象上调用以获取url的函数的好方法
app.use(function(req, res, next) {
req.getUrl = function() {
return req.protocol + "://" + req.get('host') + req.originalUrl;
}
return next();
});
Run Code Online (Sandbox Code Playgroud)
现在您有一个功能,您可以根据需要随时拨打电话.
小智 11
您可以从express的req中获取完整的url。
function fetchPages(req, res, next) {
let fullUrl = req.headers.host + req.originalUrl;
console.log("full url ==> ",fullUrl);
}
Run Code Online (Sandbox Code Playgroud)
Vag*_*nak 10
用这个,
var url = req.headers.host + '/' + req.url;
Run Code Online (Sandbox Code Playgroud)
小智 10
使req.host/req.hostname有效必须有两个条件当Express后面的代理:
app.set('trust proxy', 'loopback'); 在app.jsX-Forwarded-Host标头必须由您在Web服务器中指定.例如.apache,nginxnginx:
server {
listen myhost:80;
server_name myhost;
location / {
root /path/to/myapp/public;
proxy_set_header X-Forwarded-Host $host:$server_port;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://myapp:8080;
}
}
Run Code Online (Sandbox Code Playgroud)
阿帕奇:
<VirtualHost myhost:80>
ServerName myhost
DocumentRoot /path/to/myapp/public
ProxyPass / http://myapp:8080/
ProxyPassReverse / http://myapp:8080/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
只是下面的代码对我来说就足够了!
const baseUrl = `${request.protocol}://${request.headers.host}`;
// http://127.0.0.1:3333
Run Code Online (Sandbox Code Playgroud)
var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;
Run Code Online (Sandbox Code Playgroud)
要么
var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;
Run Code Online (Sandbox Code Playgroud)
您可以组合req.protocol、req.hostname和req.originalUrl。注意req.hostname而不是req.hostor ,req.get("host")它有效但更难阅读。
const completeUrl = `${req.protocol}://${req.hostname}${req.originalUrl}`;
Run Code Online (Sandbox Code Playgroud)
你需要使用它来构建它req.headers.host + req.url.当然,如果你在不同的端口托管,这样你就会得到这个想法;-)
我建议使用originalUrl而不是URL:
var url = req.protocol + '://' + req.get('host') + req.originalUrl;
Run Code Online (Sandbox Code Playgroud)
请在此处查看originalUrl的说明:http: //expressjs.com/api.html#req.originalUrl
在我们的系统中,我们做了类似的事情,因此originalUrl对我们很重要:
foo = express();
express().use('/foo', foo);
foo.use(require('/foo/blah_controller'));
Run Code Online (Sandbox Code Playgroud)
blah_controller看起来像这样:
controller = express();
module.exports = controller;
controller.get('/bar/:barparam', function(req, res) { /* handler code */ });
Run Code Online (Sandbox Code Playgroud)
所以我们的网址格式如下:
www.example.com/foo/bar/:barparam
Run Code Online (Sandbox Code Playgroud)
因此,我们需要bar控制器获取处理程序中的req.originalUrl.
小智 6
您可以像这样在路线中使用此功能
app.get('/one/two', function (req, res) {
const url = getFullUrl(req);
}
/**
* Gets the self full URL from the request
*
* @param {object} req Request
* @returns {string} URL
*/
const getFullUrl = (req) => `${req.protocol}://${req.headers.host}${req.originalUrl}`;
Run Code Online (Sandbox Code Playgroud)
req.protocol会给你 http 或 https,
req.headers.host会给你完整的主机名,比如 www.google.com,
req.originalUrl会给pathName你剩下的(在你的情况下/one/two)
小智 5
我使用节点包“ url”(npm install url)
它的作用是当您打电话时
url.parse(req.url, true, true)
Run Code Online (Sandbox Code Playgroud)
它将使您能够检索全部或部分网址。更多信息在这里:https : //github.com/defunctzombie/node-url
我以以下方式使用它来获取http://www.example.com/中 /之后的所有内容,以用作变量并提取特定的配置文件(有点像facebook:http://www.facebook。 com / username)
var url = require('url');
var urlParts = url.parse(req.url, true, true);
var pathname = urlParts.pathname;
var username = pathname.slice(1);
Run Code Online (Sandbox Code Playgroud)
尽管要执行此操作,但必须在server.js文件中以这种方式创建路由:
self.routes['/:username'] = require('./routes/users');
Run Code Online (Sandbox Code Playgroud)
并以此方式设置您的路由文件:
router.get('/:username', function(req, res) {
//here comes the url parsing code
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
407110 次 |
| 最近记录: |