Http系统模块使用
[TOC]
const http = require('http');
var server = http.createServer(function () {
console.log("有人来了")
})
//监听--wait
//端口
server.listen(8080)
const http = require('http');
var server = http.createServer(function (req,res) { //request 请求 response 响应
console.log('端口2222: ');
console.log(req.url);
switch (req.url) {
case '/1.html':
res.write("11111111");
break;
case '/2.html':
res.write("11111111");
break;
default:
res.write("404");
break;
}
res.end();
})
//监听--wait
//端口
server.listen(2222);
netstat -ano|findstr "端口号"
E:\code\web\node_js>netstat -ano|findstr 1111
TCP 0.0.0.0:1111 0.0.0.0:0 LISTENING 4212
TCP [::]:1111 [::]:0 LISTENING 4212
E:\code\web\node_js>netstat -ano|findstr 1112
TCP 0.0.0.0:1112 0.0.0.0:0 LISTENING 4888
TCP [::]:1112 [::]:0 LISTENING 4888
E:\code\web\node_js>netstat -ano|findstr 2222
TCP 0.0.0.0:2222 0.0.0.0:0 LISTENING 12140
TCP [::]:2222 [::]:0 LISTENING 12140
E:\code\web\node_js>netstat -ano|findstr 8080
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 5828
TCP [::]:8080 [::]:0 LISTENING 5828
任务管理器 ->PID
对应查看
[图片上传失败...(image-891312-1557021549325)]
或者使用命令行查看:tasklist|findstr PID
E:\code\web\node_js>tasklist|findstr 5828
node.exe 5828 Console 4 22,872 K
taskkill /f /t /im
进程名称 (根据进程名称结束进程)
E:\code\web\node_js>taskkill /f /t /im node.exe
成功: 已终止 PID 5828 (属于 PID 7952 子进程)的进程。
成功: 已终止 PID 4212 (属于 PID 14960 子进程)的进程。
成功: 已终止 PID 4888 (属于 PID 10284 子进程)的进程。
成功: 已终止 PID 12140 (属于 PID 6360 子进程)的进程。
如此一来:node.exe占用的所有的端口都会被结束进程
文件系统
文件操作-读与写
const fs = require('fs');
// fs.readFile('aaa.txt',function (err,data) {
// if (err) {
// console.log('读取失败');
// }else{
// console.log(data.toString());
// }
// });
fs.writeFile("bbb.txt","asfdddddd",*function*(*err*) {
console.log(err);
});
配合http系统
const http = require('http');
const fs = require('fs');
let server = http.createServer(function (req, res) {
//req.url => 'index.html'
//读取 => '.www/index.html'
//'./www/' + req.url
var file_name = './www' + req.url;
fs.readFile(file_name,function(err,data) {
console.log(file_name);
if(err){
res.write("404");
}else{
res.write(data);
}
res.end();
});
});
server.listen(8080);
这种方式 在服务还在运行的时候再添加文件,即使服务不用重启客户端也可以访问的到
http数据解析
前台 -> 后台 form ,ajax ,jsonp
对后台来说传过来的数据都一样
前台 <--http协议--> 后台请求方式
GET 在url中 跳转POST: 不在url中
header:头信息 <32K content:POST数据 1G POST数据很大,分段传输
GET方式:
(实际上对url做出处理)
querystring
querystring.parse('user=maid&pass=123'); //'user=maid&pass=123' => { user: 'maid', pass: '123' }
const http = require('http');
const querystring = require('querystring');
let server = http.createServer(function (req, res) {
let GET = {};
let url = req.url;
if(req.url.indexOf("?") != -1){
let arr = req.url.split('?'); // ['/aaa','user=maid&pass=123']
url = arr[0];
GET = querystring.parse(arr[1]); //'user=maid&pass=123' => { user: 'maid', pass: '123' }
}
console.log(url,GET);
res.write(GET.user + ": 你好");
res.end();
}).listen(8080);
url
const urlLib = require('url');
let obj = urlLib.parse("http://localhost:8080/aaa?user=maid&pass=123");
console.log(obj)
/*输出
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'localhost:8080',
port: '8080',
hostname: 'localhost',
hash: null,
search: '?user=maid&pass=123',
query: 'user=maid&pass=123',
pathname: '/aaa',
path: '/aaa?user=maid&pass=123',
href: 'http://localhost:8080/aaa?user=maid&pass=123' }
[Finished in 0.3s]
*/
所以上面的可以这样写
const http = require('http');
const urlLib = require('url');
let server = http.createServer(function (req, res) {
let obj = urlLib.parse(req.url, true);
let url = obj.pathname;
let GET = obj.query;
console.log(url,GET);
res.write(GET.user + ": 你好");
res.end();
}).listen(8080);
POST方式:
const http = require('http');
const querystring = require('querystring');
let server = http.createServer(function (req, res) {
//POST
let str = ''; //接收数据
//data--有一段数据到达(很多次)
let i = 0;
req.on('data',function(data) {
console.log(`第${i++}次收到数据`);
str += data;
});
//end--数据全部到达(一次)
req.on('end',function () {
let POST = querystring.parse(str);
console.log(POST);
});
}).listen(8080);
结合以上:
const http = require('http');
const fs = require('fs');
const querystring = require('querystring');
const urlLib = require('url');
let server = http.createServer(function(req,res) {
// GET
let obj = urlLib.parse(req.url,true);
let url = obj.pathname;
const GET = obj.query;
//POST
let str = '';
req.on('data',function(data) {
str += data;
})
req.on('end',function() {
const POST = querystring.parse(str);
})
//文件请求
var file_name = './www' + url;
fs.readFile(file_name,function(err,data) {
if(err){
res.write("404");
}else{
res.write(data);
}
res.end();
});
}).listen(8080);
简易httpServer服务搭建:
后台:
const http = require('http');
const fs = require('fs');
const querystring = require('querystring');
const urlLib = require('url');
var users = {}; //{"name":"pass","maid":"123123"}
let server = http.createServer(function(req,res) {
// 解析数据
var str = '';
req.on('data',function (data) {
str += data;
})
req.on('end',function () {
let obj = urlLib.parse(req.url, true);
const url = obj.pathname;
const GET = obj.query;
const POST = querystring.parse(str);
//区分文件和接口
if(url == '/user'){ //接口
switch (GET.act)
{
//注册
case 'reg':
//1.检查用户名是否纯在
//2.插入users
if(users[GET.user]){
//返回错误信息
res.write('{"ok":false,"msg":"此用户存在"}');
}else{
users[GET.user] = GET.pass;
//返回成功信息
res.write('{"ok":true,"msg":"注册成功"}');
}
break;
//登陆
case 'login':
//1.检查用户是否纯在
//2.检查密码
if(users[GET.user]){
if(users[GET.user] == GET.pass){
res.write('{"ok":true,"msg":"登陆成功"}');
}else{
res.write('{"ok":false,"msg":"用户名或密码错误"}');
}
}else{
res.write('{"ok":false,"msg":"用户不存在"}');
}
break;
default:
res.write('{"ok":false,"msg":"未知的act"}');
break;
}
res.end();
}else{ //文件
//读取文件
var file_name = './www' + url;
fs.readFile(file_name,function (err,data){
if(err){
res.write('404');
}else{
res.write(data);
}
res.end();
});
}
})
}).listen(8080);
前台
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="jquery-3.3.1.min.js"></script>
<script >
window.onload = function () {
var oTxtUser = document.getElementById('user');
var oTxtPass = document.getElementById('pass');
var oBtnReg = document.getElementById('reg_btn');
var oBtnLogin = document.getElementById('login_btn');
oBtnLogin.onclick = function () {
$.ajax({
type: "GET",
url: "/user",
data: { act: 'login', user: oTxtUser.value, pass: oTxtPass.value},
success: function (str) {
var json = eval('(' + str + ')');
if(json.ok){
alert("登陆成功");
}else{
alert("登陆失败:" + json.msg);
}
}
});
}
//注册按钮
oBtnReg.onclick = function () {
$.ajax({
url: "/user",
data: { act: 'reg', user: oTxtUser.value, pass: oTxtPass.value },
type: "GET",
success: function (str) {
var json = eval('(' + str + ')');
if(json.ok){
alert("注册成功");
}else{
alert("注册失败" + json.msg);
}
},
error:function(){
alert('通信出错');
}
});
}
}
</script>
</head>
<body>
用户:
<input type="text" name="user" id="user"><br>
密码:
<input type="password" name="pass" id="pass"><br>
<input type="submit" value="注册" id="reg_btn">
<input type="submit" value="登陆" id="login_btn">
</body>
</html>
流程:
前端通过GET/POST
的方式将url,data等数据传给后端,后端通过
let obj = urlLib.parse(req.url, true);
获取Url对象('pathname'
对应前端ajax
的'url'
,query
对应前端的'data'
),在后端处理数据之后,通过:
res.write('{"ok":false,"msg":"用户名或密码错误"}');
返回错误或者成功信息,然后前端的ajax
的成功/失败回调函数执行,参数是后端的返回值
网友评论