Node.js url 模块
Node.js 中的 url
模块是一个内置模块,用于处理和解析 URL(统一资源定位符)。它提供了一系列实用方法,可以轻松地解析、格式化和处理 URL 字符串。
URL(Uniform Resource Locator)是互联网上用来标识和定位资源的地址,例如:
https://www.example.com:8080/path/to/resource?query=string#hash
核心方法
url.parse() 方法
url.parse()
方法用于将一个 URL 字符串解析为一个 URL 对象。
实例
const url = require('url');
const urlString = 'https://www.example.com:8080/path/to/resource?query=string#hash';
const parsedUrl = url.parse(urlString);
console.log(parsedUrl);
const urlString = 'https://www.example.com:8080/path/to/resource?query=string#hash';
const parsedUrl = url.parse(urlString);
console.log(parsedUrl);
输出结果将包含以下属性:
protocol
: 协议(如 'https:')host
: 主机名和端口(如 'www.example.com:8080')hostname
: 主机名(如 'www.example.com')port
: 端口号(如 '8080')pathname
: 路径部分(如 '/path/to/resource')query
: 查询字符串(如 'query=string')hash
: 片段标识符(如 '#hash')
url.format() 方法
url.format()
方法与 parse()
相反,它将 URL 对象转换为字符串形式。
实例
const url = require('url');
const urlObject = {
protocol: 'https:',
host: 'www.example.com:8080',
pathname: '/path/to/resource',
query: { query: 'string' },
hash: '#hash'
};
const formattedUrl = url.format(urlObject);
console.log(formattedUrl);
// 输出: https://www.example.com:8080/path/to/resource?query=string#hash
const urlObject = {
protocol: 'https:',
host: 'www.example.com:8080',
pathname: '/path/to/resource',
query: { query: 'string' },
hash: '#hash'
};
const formattedUrl = url.format(urlObject);
console.log(formattedUrl);
// 输出: https://www.example.com:8080/path/to/resource?query=string#hash
url.resolve() 方法
url.resolve()
方法用于解析相对于基础 URL 的目标 URL。
实例
const url = require('url');
const baseUrl = 'https://www.example.com/path/';
const relativeUrl = 'to/resource';
const resolvedUrl = url.resolve(baseUrl, relativeUrl);
console.log(resolvedUrl);
// 输出: https://www.example.com/path/to/resource
const baseUrl = 'https://www.example.com/path/';
const relativeUrl = 'to/resource';
const resolvedUrl = url.resolve(baseUrl, relativeUrl);
console.log(resolvedUrl);
// 输出: https://www.example.com/path/to/resource
URL 对象的结构
一个完整的 URL 对象通常包含以下属性:
- 协议 (protocol) - 如 'http:' 或 'https:'
- 认证信息 (auth) - 包含用户名和密码
- 主机 (host) - 主机名和端口号
- 主机名 (hostname) - 仅主机名
- 端口 (port) - 端口号
- 路径 (pathname) - 资源路径
- 查询字符串 (search) - 以 '?' 开头的查询字符串
- 查询参数 (query) - 查询字符串的解析结果
- 片段标识符 (hash) - 以 '#' 开头的片段标识符
新版 URL API
Node.js 还提供了基于 WHATWG URL 标准的新版 API:
URL 类
实例
const { URL } = require('url');
const myUrl = new URL('https://www.example.com:8080/path/to/resource?query=string#hash');
console.log(myUrl.protocol); // 'https:'
console.log(myUrl.hostname); // 'www.example.com'
console.log(myUrl.port); // '8080'
console.log(myUrl.pathname); // '/path/to/resource'
console.log(myUrl.search); // '?query=string'
console.log(myUrl.hash); // '#hash'
const myUrl = new URL('https://www.example.com:8080/path/to/resource?query=string#hash');
console.log(myUrl.protocol); // 'https:'
console.log(myUrl.hostname); // 'www.example.com'
console.log(myUrl.port); // '8080'
console.log(myUrl.pathname); // '/path/to/resource'
console.log(myUrl.search); // '?query=string'
console.log(myUrl.hash); // '#hash'
URLSearchParams 类
URLSearchParams
提供了处理查询字符串的便捷方法:
实例
const { URL, URLSearchParams } = require('url');
const myUrl = new URL('https://example.com/?name=John&age=30');
const params = new URLSearchParams(myUrl.search);
// 获取参数
console.log(params.get('name')); // 'John'
console.log(params.get('age')); // '30'
// 添加参数
params.append('city', 'New York');
// 删除参数
params.delete('age');
// 转换为字符串
console.log(params.toString()); // 'name=John&city=New+York'
const myUrl = new URL('https://example.com/?name=John&age=30');
const params = new URLSearchParams(myUrl.search);
// 获取参数
console.log(params.get('name')); // 'John'
console.log(params.get('age')); // '30'
// 添加参数
params.append('city', 'New York');
// 删除参数
params.delete('age');
// 转换为字符串
console.log(params.toString()); // 'name=John&city=New+York'
实际应用场景
1. 解析请求 URL
在 HTTP 服务器中解析客户端请求的 URL:
实例
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
console.log('Path:', parsedUrl.pathname);
console.log('Query:', parsedUrl.query);
res.end('URL parsed successfully');
});
server.listen(3000);
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
console.log('Path:', parsedUrl.pathname);
console.log('Query:', parsedUrl.query);
res.end('URL parsed successfully');
});
server.listen(3000);
2. 构建 API 端点
使用 URL 模块构建 RESTful API 端点:
实例
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const path = parsedUrl.pathname;
if (path === '/api/users') {
// 处理用户相关请求
res.end(JSON.stringify({ users: ['John', 'Jane'] }));
} else if (path === '/api/products') {
// 处理产品相关请求
res.end(JSON.stringify({ products: ['Phone', 'Laptop'] }));
} else {
res.statusCode = 404;
res.end('Not Found');
}
});
server.listen(3000);
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const path = parsedUrl.pathname;
if (path === '/api/users') {
// 处理用户相关请求
res.end(JSON.stringify({ users: ['John', 'Jane'] }));
} else if (path === '/api/products') {
// 处理产品相关请求
res.end(JSON.stringify({ products: ['Phone', 'Laptop'] }));
} else {
res.statusCode = 404;
res.end('Not Found');
}
});
server.listen(3000);
3. 处理查询参数
实例
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const query = parsedUrl.query;
if (parsedUrl.pathname === '/search') {
const keyword = query.q || '';
const page = parseInt(query.page) || 1;
res.end(`Searching for "${keyword}" on page ${page}`);
}
});
server.listen(3000);
const url = require('url');
const server = http.createServer((req, res) => {
const parsedUrl = url.parse(req.url, true);
const query = parsedUrl.query;
if (parsedUrl.pathname === '/search') {
const keyword = query.q || '';
const page = parseInt(query.page) || 1;
res.end(`Searching for "${keyword}" on page ${page}`);
}
});
server.listen(3000);
最佳实践
- 始终验证 URL - 在处理用户提供的 URL 时,始终验证其有效性
- 使用新版 API - 优先使用 WHATWG URL API,它更符合现代标准
- 处理异常 - 使用 try-catch 处理 URL 解析可能出现的错误
- 编码特殊字符 - 使用
encodeURIComponent()
对查询参数中的特殊字符进行编码 - 安全性考虑 - 当处理重定向时,验证目标 URL 以防止开放重定向漏洞
实例
// 安全示例:验证重定向 URL
function isValidRedirect(url) {
const allowedDomains = ['example.com', 'trusted-site.com'];
const parsedUrl = new URL(url);
return allowedDomains.includes(parsedUrl.hostname);
}
function isValidRedirect(url) {
const allowedDomains = ['example.com', 'trusted-site.com'];
const parsedUrl = new URL(url);
return allowedDomains.includes(parsedUrl.hostname);
}
通过掌握 Node.js 的 url
模块,你可以轻松处理各种 URL 相关操作,构建更加健壮和安全的网络应用。
点我分享笔记