http - HTTP
若要使用 HTTP 服务器和客户端,则可以 require('http')
。
最简单的一个应用:
// 1 引入模块
const http = require('http');
// 2 创建服务器
http.createServer((req, res) => {
if(req.url === '/') {
console.log(req.url);
res.write('hello world!');
res.end();}
}).listen(5000, () => {
console.log('服务器已运行...')
})
综合应用:
// 1 引入模块
const http = require('http');
const path = require('path');
const fs = require('fs');
// 2 创建变量,存储服务器对象
const server = http.createServer((req, res) => {
if(req.url === '/') {
console.log(req.url);
res.end('<h1>HOME</h1>');
}
});
// 3 创建端口号
const PORT = process.env.PORT || 9999; //设置PORT的环境变量
// 4 监听端口
server.listen(9999, () => {
console.log(`服务器已经在${PORT}端口号运行...`);
});
修改代码后需要重新启动,有点繁琐,于是使用nodemon。
使用nodemon:监听代码文件的变动,当代码改变时,自动重启。
-
安装
npm install -g nodemon --save-dev
-
使用
nodemon xx.js
根据请求url的不同,返回不同的文件:
// 1 引入模块
const http = require('http');
const path = require('path');
const fs = require('fs');
// 2 创建变量,存储服务器对象
const server = http.createServer((req, res) => {
// 加载主页
if(req.url === '/') {
fs.readFile(path.join(__dirname, 'public', 'index.html'), (err, data) => {
if (err) throw err;
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
})
}
//加载关于页面
if(req.url === '/about') {
fs.readFile(path.join(__dirname, 'public', 'about.html'), (err, data) => {
if (err) throw err;
res.writeHead(200, {'Content-Type': 'text/html'});
res.end(data);
})
}
// 加载Json数据
if(req.url === '/api/users') {
const users = [
{name: 'Summer', age: 25},
{name: 'Lucy', age: 28}
];
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(users));
}
});
// 3 创建端口号
const PORT = process.env.PORT || 9999; //设置PORT的环境变量
// 4 监听端口
server.listen(9999, () => {
console.log(`服务器已经在${PORT}端口号运行...`);
});
封装:
// 1 引入模块
const http = require('http');
const path = require('path');
const fs = require('fs');
// 2 创建变量,存储服务器对象
const server = http.createServer((req, res) => {
//创建变量 filePath 存储文件绝对路径
let filePath = path.join(__dirname, 'public', req.url === '/' ? 'index.html' : req.url);
//初始化content type
let contentType = 'text/html';
//获取文件扩展名
let extName = path.extname(filePath);
//通过验证扩展名设置content type
switch (extName){
case '.js':
contentType = 'text/javascript';
break;
case '.css':
contentType = 'text/css';
break;
case '.json':
contentType = 'application/json';
break;
case '.png':
contentType = 'image/png';
break;
case '.jpg':
contentType = 'image/jpg';
break;
}
// 读取文件
fs.readFile(filePath, (err, data) => {
if (err) {
if(err.code === 'ENOENT') {
//没找到页面
fs.readFile(path.join(__dirname, 'public', '404.html'), (err, data) => {
if (err) throw err;
res.writeHead(200, {'Content-type': 'text/html'});
res.end(data);
})
}else{
//其他浏览器错误
res.writeHead(500);
res.end(`服务器错误:${err.code}`);
}
}else{
//成功
res.writeHead(200, contentType);
res.end(data, 'utf8')
}
})
});
// 3 创建端口号
const PORT = process.env.PORT || 9999; //设置PORT的环境变量
// 4 监听端口
server.listen(9999, () => {
console.log(`服务器已经在${PORT}端口号运行...`);
});