前言
前面我们创建了一个HTTP服务器,如果只是简单的http://localhost:3000/about这种链接我们是可以处理的,但是实际运用中一般链接都会带参数,这样的话如果我们只是简单的判断链接来分配数据,就会报404找不到链接。为了解决这个问题,我们这篇文章就介绍url模块来处理url地址。
url模块有新旧两版用法,我们这篇文章就只介绍新的用法。
在 Node.js 中,url
模块提供了用于处理和解析 URL(统一资源定位符)的实用工具。它允许开发者轻松地将一个 URL 字符串分解为其各个组成部分,如协议、主机、端口、路径、查询参数和片段等,并且可以用于构建新的 URL。这个模块是 Node.js 核心模块的一部分,所以不需要额外安装,直接通过require('url')
就可以使用。
URL解析
url.parse()
方法:这是url
模块中最常用的方法之一。它接受一个 URL 字符串作为输入,并返回一个包含 URL 各个部分的对象。例如:
const url = require('url');
const myURL = 'https://example.com:8080/path/to/file?name=value#fragment';
const parsedURL = url.parse(myURL);
console.log(parsedURL);
输出结果会是一个类似这样的对象:
{
protocol: 'https:',
slashes: true,
host: 'example.com:8080',
port: '8080',
hostname: 'example.com',
hash: '#fragment',
search: '?name=value',
query: 'name=value',
pathname: '/path/to/file',
path: '/path/to/file?name=value',
href: 'https://example.com:8080/path/to/file?name=value#fragment'
}
从这个对象中可以清楚地看到 URL 的各个组成部分被分解出来了。
rl.parse()
的第二个参数:这个方法还有一个可选的第二个参数,它是一个布尔值。如果设置为true
,那么query
属性的值将是一个经过querystring.parse()
方法处理后的对象,而不是一个字符串。例如:
const url = require('url');
const myURL = 'https://example.com:8080/path/to/file?name=value&age=20';
const parsedURL = url.parse(myURL, true);
console.log(parsedURL.query);
输出结果:
{
name: 'value',
age: 20
}
URL 格式化(构建新的 URL)
url.format()
方法:这个方法与url.parse()
相反,它接受一个包含 URL 各个部分的对象,并返回一个格式化后的 URL 字符串。例如:
const url = require('url');
const urlObject = {
protocol: 'https:',
hostname: 'example.com',
port: '8080',
pathname: '/path/to/file',
search: '?name=value',
hash: '#fragment'
};
const newURL = url.format(urlObject);
console.log(newURL);
输出结果为:
https://example.com:8080/path/to/file?name=value#fragment
实例
//使用http模块创建服务器,我们建议使用commonjs模块规范,因为很多第三方的组件都使用了这种规范。当然es6写法也支持。
//http模块式Node.js内置的模块,用于创建和管理HTTP服务器。传统的HTTP服务器一般使用C语言编写,但Node.js使用JavaScript实现,因此性能更好。
const http = require('http')
//url模块用于解析url参数
const url=require('url');
//创建服务器,监听3000端口
http.createServer((req, res) => {
//判断请求url是否为favicon.ico,如果是则返回空(这个请求是一个浏览器的默认请求,可以忽略)
if (req.url === '/favicon.ico') {
return
}
//设置响应头,状态码为200,内容类型为text/html;charset=utf-8,这种才能正常显示中文
res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'})
//解析url参数,这里的第二个参数为true,表示解析query字符串,返回object格式
const parsedUrl = url.parse(req.url,true);
console.log(parsedUrl);
let {pathname,query}=parsedUrl;
//分配响应内容
res.write(switchPage(pathname))
res.write(`<p>queryParams: ${JSON.stringify(query)}</p>`)
//这里必须要end,否则会出现卡死的情况
res.end()
}).listen(3000, () => {
console.log('Server is running on port 3000')
})
/**
* 根据url返回对应的页面内容
* @param url
* @returns {*|string}
*/
const switchPage = (url) => {
return {
'/home': `<h1>Home Page</h1><p>Welcome to my website</p>`,
'/about': `<h1>About Page</h1><p>This is a paragraph about me</p><img src="https://picsum.photos/200" alt="Random Image">`,
'/list': `<h1>List Page</h1><ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>`,
}[url] || `<h1>404 Not Found</h1><p>The page you are looking for does not exist</p>`
}
输入http://localhost:3000/about?name=%E5%B0%8F%E5%BC%A0&age=33
可以解析出请求参数query以及pathname,然后通过pathname找到映射的内容
nodemon自动启动服务(简单使用)
每次修改完代码都需要node server.js重启服务这种太麻烦了,nodemon
是一个实用的工具,主要用于开发基于 Node.js 的应用程序。它能够监视 Node.js 应用程序中的文件变化,当检测到文件变化时,自动重新启动服务器。这样可以极大地提高开发效率,开发者无需手动停止并重新启动服务器来使代码更改生效。
使用 npm install -g nodemon 安装就行
安装完成后,在运行 Node.js 应用程序时,将node
命令替换为nodemon
。例如,如果你的应用程序的入口文件是server.js
,通常你是使用node server.js
来启动服务器,现在可以使用nodemon server.js
。
启动成功