两种方式实现:
一
const http = require('http');
//创建服务器对象
http.createServer((request,response)=>{
// write向客户端返回数据
response.write('Hello world!');
response.write('Hello kitty!');
// 完成响应,end不可以省略,否则客户端无法获取响应数据
response.end('Hello Tom');
// listen用来监听服务器IP和端口
}).listen(3000,'192.168.99.1',()=>{
// 服务器启动之后调用该方法
console.log('running......');
});
二
// 创建服务器对象
let server = http.createServer();
// 监听客户端的请求
server.on('request',(req,res)=>{
// 响应客户端的请求,响应完成时也可以同时返回数据
res.end('Hello Jerry');
});
// 监听指定端口和IP地址
server.listen(3000,'192.168.99.1',()=>{
// 服务器启动之后调用该方法
console.log('running........');
});
细节分析:
const http = require('http');
// req 是Class: http.IncomingMessage的实例对象,用来获取请求相关的信息
// res 是Class: http.ServerResponse的实例对象,用来相应客户请求设置相关信息
http.createServer((req,res)=>{
// 请求头信息
// console.log(req.headers);
// 请求URL
// console.log(req.url);
// 根据URL的不同可以返回不同的内容(路由)
if(req.url.endsWith('index.html')){
res.end('index.html');
}else if(req.url.endsWith('about.html')){
res.end('about.html');
}else{
res.end('list.html');
}
}).listen(3000,()=>{
console.log('running.....');
});
根据请求的url地址,实现静态服务器功能:
const http = require('http');
const path = require('path');
const fs = require('fs');
const mime = require('./mime.json');//对应的扩展名
let staticDir = '/www';
let info404 = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>404</title>
</head>
<body>
<div>页面消失不见了</div>
</body>
</html>
http.createServer((req,res)=>{
// 根据URL地址读取对应文件的内容然后返回客户端
if(req.url.startsWith(staticDir)){
let filename = path.basename(req.url);
fs.readFile(path.join(__dirname,staticDir,filename),(err,data)=>{
if(err){
res.end(info404);
return ;
}
// 获取URL中文件的扩展名
let ext = path.extname(req.url);
// 设置响应类型的默认值
let cType = 'text/html';
// 如果请求的文件格式存在就覆盖默认值,不存在就是使用默认值
if(mime[ext]){
cType = mime[ext];
}
//文本文件需要指定编码,图片不需要
if(mime[ext].startsWith('text')){
cType += '; charset=utf8'
}
// 设置响应头信息
res.writeHead(200,{
'Content-Type':cType
})
// 完成响应并返回内容
res.end(data);
});
}
}).listen(3000,()=>{
console.log('running......');
});
url参数解析:
url.parse() ,利用这种方法就可以取得url地址参数,即get方法
onst url = require('url');
// let str = 'http://www.baidu.com:8080/abc/qqq/ddd?key=123&word=javascript#id';
// let str = '//foo/bar';
// 第一个参数为url字符串
// 第二个参数true表示把query属性变成对象形式
// 第三个参数的作用主要用于操作//foo/bar这种格式的字符串,把双斜杠后面的第一个字符串解析为host
// let obj = url.parse(str,true,true);
// console.log(obj);
// console.log(obj.query.key);
// console.log(obj.query.word);
url.format()
let o = {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.baidu.com',
port: null,
hostname: 'www.baidu.com',
hash: null,
search: '?key=123&word=javascript',
query: 'key=123&word=javascript',
pathname: '/abc/qqq/ddd',
path: '/abc/qqq/ddd?key=123&word=javascript',
href: 'http://www.baidu.com/abc/qqq/ddd?key=123&word=javascript'
};
// 把对象转换成标准格式的url字符串
let str = url.format(o);
console.log(str);
从服务器角度获取get请求参数
const http = require('http');
const url = require('url');
const sserver = require('./static-server.js');//封装的静态服务器模块
http.createServer((req,res)=>{
// 启动静态服务器功能
sserver.initStaticServer(req,res,__dirname,'/www');
// 判断是否为表达提交url
if(req.url.startsWith('/check')){
let obj = url.parse(req.url,true);
if(obj.query){
// 设置响应内容格式和编码
res.writeHead(200,{
'Content-Type':'text/plain; charset=utf8'
});
// 判断用户名和密码是否正确
if(obj.query.username=='admin'&&obj.query.password=='123'){
res.end('登录成功');
}else{
res.end('用户名或者密码错误');
}
}
}
}).listen(3000,()=>{
console.log('running...');
});
从服务器角度获取post提交数据
const http = require('http');
const querystring = require('querystring'); //引入querystring模块
const sserver = require('./static-server.js');
http.createServer((req, res) => {
// 启动静态服务器功能
sserver.initStaticServer(req, res, __dirname, '/www');
// 判断是否为表达提交url
if (req.url.startsWith('/check')) {
let pdata = '';
let num = 1;
// 基于事件的回调函数,回调函数接受到一部分数据就调用一次
req.on('data', (chunk) => {
num++; //接收两次num++ 2次
pdata += chunk;
});
// 接受到所有的数据之后才调用end对应的回调函数
req.on('end',()=>{
let obj = querystring.parse(pdata);
// 设置响应内容格式和编码
res.writeHead(200,{
'Content-Type':'text/plain; charset=utf8'
});
// 判断用户名和密码是否正确
if(obj.username=='admin'&&obj.password=='123'){
res.end('登录成功');
}else{
res.end('用户名或者密码错误');
}
});
}
}).listen(3000, () => {
console.log('running...');
});