一、什么是Node?
Node是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它让 JavaScript 可以脱离浏览器 Node.js(简称 Node)也能正常运行,它打破了传统上 JavaScript 只能在浏览器中运行的限制,让 JavaScript 可以用于服务器端编程。应用场景有:
- 构建高性能的 API 服务和后端服务器
- 开发实时通信应用(如聊天工具、在线协作工具)
- 处理大量 I/O 操作的场景(如日志处理、数据流式处理)
- 构建命令行工具(如前端工程化工具 Webpack、Vue CLI 等)
- 开发游戏服务器、物联网(IoT)应用等
二、安装Node
安装Node可前往它的官网自行下载:nodejs.org/en/
以下测试代码都执行在node环境中,在控制台输入node 文件名.js即可。为了不用每次改动都执行一次node命令,可执行npm i -g nodemonnodemon在node的基础上增加了自动重启服务的功能,实时监听文件的改动并执行,在终端中执行nodemon 文件名.js即可。
三、Node内置模块
1. http模块
(1)创建一个简单的服务器
创建一个js文件http模块-01.js,写入以下代码:
js
// 内置模块http,直接引入
const http = require('http')
// 使用createServer创建本地服务器
const server = http.createServer((req, res) => {
// 回调函数,接收浏览器传的参数,返回渲染的内容
res.write('Hello JavaScript')
// 结束响应要调用end(),否则浏览器得不到响应
res.end()
})
// 设置监听端口号
server.listen(8888, () => {
console.log('server 启动')
})
控制台执行node .\http模块-01.js,在浏览器中输入localhost:8888进行访问,查看浏览器返回:
可见,浏览器能正确渲染服务器返回的内容。
也可以设置服务器返回html文本,但是要在头部设置浏览器解析的格式和编码
js
// 内置模块http,直接引入
const http = require('http')
// 使用createServer创建本地服务器
const server = http.createServer((req, res) => {
// 设置浏览器要用什么格式解析服务器返回的内容,如果不设置,返回的只是html字符串
res.writeHead(200, {'Content-Type': 'text/html;charset=utf-8'})
res.write(`
<h2>你好 JavaScript</h2>
`)
// res.end()方法也可以追加返回内容
res.end('[1,2,3]')
})
// 设置监听端口号
server.listen(8888, () => {
console.log('server 启动')
})
浏览器查看效果:

(2)响应浏览器的请求
首先可以打印一下,req有什么信息
js
const http = require('http')
const server = http.createServer((req, res) => {
console.log(req)
res.write('123')
res.end()
})
server.listen(8888, () => {
console.log('server 启动')
})
在控制台用node执行,查看输出,可见req是一个包含了众多内容的参数:

当我们在浏览器输入地址后,可以通过url查看具体请求的地址,比如输入http://localhost:8888/home
js
const http = require('http')
const server = http.createServer((req, res) => {
// 过滤掉浏览器默认请求的偏爱图标
if (req.url === '/favicon.ico') {
return
}
console.log(req.url)
res.write('123')
res.end()
})
server.listen(8888, () => {
console.log('server 启动')
})
,查看控制台打印: 
通过获取的url可以针对性返回内容,比如输入的是请求具体页面的地址,我们就返回带html的内容,如果是请求具体接口的地址,我们就返回数据。 首先,创建js文件url_module,模拟请求地址:
js
const urlList = ['/index', '/list', '/api/a']
function statusResult(url) {
return urlList.includes(url) ? 200 : 404
}
function responseResult(url) {
switch(url) {
case '/index':
return `<h2>index页面</h2>`
case 'list':
return `<h2>list页面</h2>`
case '/api/a':
return JSON.stringify({
data: 'aaaa'
})
default:
return '404 资源不存在'
}
}
module.exports = {
statusResult,
responseResult
}
再处理响应的文件中引入:
js
const http = require('http')
const urlModule = require('./url_module')
const server = http.createServer((req, res) => {
// 过滤掉浏览器默认请求的偏爱图标
if (req.url === '/favicon.ico') {
return
}
res.writeHead(urlModule.statusResult(req.url), {'Content-Type': 'text/html;charset=utf-8'})
res.write(urlModule.responseResult(req.url))
res.end()
})
server.listen(8888, () => {
console.log('server 启动')
})
浏览器看一下效果

2.url模块
url模块能解析处理请求传参,在下面代码中,用url.parse()方法来解析url,在浏览器中输入http://localhost:8888/api/a?username=lucy,可以打印一下解析的结果是什么:
js
const http = require('http')
const url = require('url')
const urlModule = require('./url_module')
const server = http.createServer((req, res) => {
// 过滤掉浏览器默认请求的偏爱图标
if (req.url === '/favicon.ico') {
return
}
console.log('url...', req.url)
console.log(url.parse(req.url))
// res.writeHead(urlModule.statusResult(req.url), {'Content-Type': 'text/html;charset=utf-8'})
// res.write(urlModule.responseResult(req.url))
res.end()
})
server.listen(8888, () => {
console.log('server 启动...')
})
打印结果如下,其中pathname是请求路径,query是传参:
但是此时query是字符串,还是不方便我们解析,在parse()中新增传参,即可获得对象形式的query:

url模块不仅能解析url形式的字符串,也能将url格式的对象转为字符串:
js
const url = require('url')
console.log(url.format({
protocol: 'https',
host: 'taobao.com',
hostname: 'taobao.com',
query: {name: 'lucy', age: 14},
}))
// 输出:https://taobao.com?name=lucy&age=14
url模块还有resolve方法,用于路径的拼接:
js
const url = require('url')
如果前面字符串后面不带/,后面的字符串会替换前面字符串最后一个/后面的内容
console.log(url.resolve('https://aaa/bbb', 'ccc')) // 输出https://aaa/ccc
console.log(url.resolve('https://aaa/bbb/', 'ccc')) // 输出https://aaa/bbb/ccc
// 如果后面字符串带/,则会直接替换掉前面字符串整个路径名
console.log(url.resolve('https://aaa.com/bbb/', '/ccc'))// 输出https://aaa.com/ccc
先了解到这里,后续还有再继续补充