nodejs 如何手动实现服务器


Posted in NodeJs onAugust 20, 2018

这是一个连续的node学习笔记, 本文是第一章, 会持续更新, 持续完善

python好用,用久了就会把人的脾气养起来, nodejs不好用, 但效率很好, 也能彻底治好你的坏脾气

nodejs的回调是我用过的最蛋疼的编程方式之一, 但也足够巧妙, 学好node, 对一个程序员而言, 也是一个稳赚不赔的买卖

废话不多说, 上代码

 1. 完成环境的搭建, 运行一个正则,提取字符串中的数字

let numRe = /\d+/g;
console.log("123dsgfas 12434 sdfasdf234dagsdfg".match(numRe));

nodejs 如何手动实现服务器 

nodejs的语法和浏览器js的语法非常接近, 安装好node后, 可以写个正则, 测试一下环境是否安装成功, 通过atom的script插件容易造成端口占用,建议学习过程中用命令行工具执行node脚本, 如 node HelloWorld.js

2. http模块开启一个服务

const http = require("http")
//开启一个监听8080端口的静态服务
http.createServer(function(req, res){
 console.log("==>", req.url);
 if (req.url === "/1.html"){
  res.write("you have request 1.html");
 }else if (req.url === "/2.html") {
  res.write("you have request 2.html");
 }else{
  res.write("404(page not found)");
 }
 res.end();
}).listen(8080)

开启服务,分三步:

第一步: 引入模块
第二步: 调用模块http.createServer
第三步: 监听端口http.createServer(function(req, res){}).listen(8080)

3. fs模块读写文件

const fs = require("fs");
// 写入文件
fs.writeFile("HelloWorld.txt", "HelloWorld HelloNode", function(err){
 if(err){
  console.log(err);
 }
 // 读取刚刚写入的数据
 else{
  fs.readFile("HelloWorld.txt", function(err, data) {
   if(err){
    console.log(err);
   }else{
    console.log(data.toString());
   }
  })
 }
})

简单读写文件非常简单, 与其它编程语言类似, 把调用方法背过就可以了

4.实现一个静态http服务器

const http = require("http");
const fs = require("fs")


http.createServer(function(req, res){
 // 打开 www/ 目录下的文件
 fs.readFile("./www/"+req.url, function(err, data) {
  if(err){
   console.log(err);
   res.write("404");
   res.end();
  }else{
   console.log(data.toString())
   res.write(data);
   res.end();
  }
 })

}).listen(8080)

通过了读取 www/ 目录下的文件, 实现了静态资源服务器

5.获取get数据

const http = require("http");
const url = require("url");

http.createServer(function(req, res){
 let reqObj = url.parse(req.url, true)
 let urlPath = reqObj.path;
 let urlData = reqObj.query;
 let log = "==>urlPath:" + urlPath +"==>>urlData:"+ JSON.stringify(urlData);
 console.log(log);
 res.write(log);
 res.end();
}).listen(6060)

解析get请求的参数

6.获取post数据

const http = require("http");
const querystring = require("querystring");

http.createServer(function(req, res){
 let dataStr = '';
 let i = 0;
 req.on("data", function(data){
  dataStr+=data;
  console.log(`第${i++}次收到数据`);
 })

 req.on("end", function(){
  console.log("end");
  let parseData = querystring.parse(dataStr);
  console.log("parseData:", parseData);
  res.write(new Buffer(dataStr, "utf8"));
  res.end();
 })

}).listen(8800)

解析post请求的参数

小结: 用已有知识 实现简单的服务器程序

const http = require("http");
const fs = require("fs");
const querystring = require("querystring");

/*
*1. 访问www内的静态资源
*2. 解析get请求, 并保存到serverLog.txt
*3. 解析post请求serverLog.txt
*/

// 获取当前时间
function getNowDate(){
  let dt = new Date();

  let year = dt.getFullYear();
  let month = dt.getMonth();
  let day = dt.getDate();
  // 将月份加1
  month = month + 1;
  // 将月份补齐到两位
  if (month <= 9){
    month = "0" + month;
  }

  // 将日补齐到两位
  if (day <= 9){
    day = "0" + day;
  }

  let hour = dt.getHours();
  let minutes = dt.getMinutes();
  let seconds = dt.getSeconds();


  return year+"-"+month+"-"+day+"-"+hour+"-"+minutes+"-"+seconds;
}

http.createServer(function(req, res){
 // 1. 尝试访问www下的静态资源
 fs.readFile("./www"+req.url, function(err, data){
  if(err){
   //2. 解析请求的参数, 并保存到log
   if(req.method === "GET"){
    console.log("收到了GET请求")
    let getData = querystring.parse(req.url.split("?")[1]);
    console.log("获得的get数据为==>",getData);
    fs.writeFile("./serverLog.txt", getNowDate()+"\n"+JSON.stringify(getData)+"\n", {flag: 'a'},function(err){
     if(err){
      console.log(err);
      console.log("GET数据保存至log出错");
     }

    });
   }else if (req.method == "POST") {
    console.log("收到了POST请求")
    let tmpData = ''
    req.on("data", function(data){
     tmpData+=data;
    });

    req.on("end", function(){
     let postData = querystring.parse(tmpData);
     console.log("获得的post数据为==>", postData);

     fs.writeFile("./serverLog.txt",getNowDate()+"\n"+JSON.stringify(postData)+"\n", {flag: 'a'},function(err){
      if(err){
       console.log(err);
       console.log("POST数据保存至log出错");
      }

     });
    })
   }
   res.write("404");
   res.end();
  }else{
   res.write(data);
   res.end();
  }
 })


}).listen(8000)

python测试脚本

import requests

requests.get("http://127.0.0.1:8000/?name=zhaozhao&age=18&method=GET")

requests.post("http://127.0.0.1:8000", data={"name": "zhaozhao", "age": 18, "method": "POST"})

nodejs 如何手动实现服务器 

nodejs 如何手动实现服务器 

nodejs 如何手动实现服务器

熟悉了nodejs回调机制, 用原生nodejs写服务器程序是一件很有效率的事情 , 测试脚本还是requests好用!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
Google官方支持的NodeJS访问API,提供后台登录授权
Jul 29 NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
Nodejs爬虫进阶教程之异步并发控制
Feb 15 NodeJs
详解nodejs 文本操作模块-fs模块(一)
Dec 22 NodeJs
详解nodejs 文本操作模块-fs模块(四)
Dec 22 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
Nodejs中的JWT和Session的使用
Aug 21 NodeJs
nodejs中方法和模块用法示例
Dec 24 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
在nodejs中创建child process的方法
Jan 26 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 #NodeJs
NodeJs项目中关闭ESLint的方法
Aug 09 #NodeJs
nodejs之koa2请求示例(GET,POST)
Aug 07 #NodeJs
NodeJS实现自定义流的方法
Aug 01 #NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 #NodeJs
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
Jul 31 #NodeJs
nodejs 十六进制字符串型数据与btye型数据相互转换
Jul 30 #NodeJs
You might like
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
PHP strtok()函数的优点分析
2010/03/02 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
28个JS验证函数收集
2010/03/02 Javascript
基于jquery的表格排序
2010/09/11 Javascript
jQuery的cookie插件实现保存用户登陆信息
2014/04/15 Javascript
FullCalendar日历插件应用之数据展现(一)
2015/12/23 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
2016/07/19 Javascript
浅谈js继承的实现及公有、私有、静态方法的书写
2016/10/28 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
jQuery EasyUI之验证框validatebox实例详解
2017/04/10 jQuery
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
js根据json数据中的某一个属性来给数据分组的方法
2018/10/08 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)
2017/05/25 Python
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
Python如何测试stdout输出
2020/08/10 Python
Python利用imshow制作自定义渐变填充柱状图(colorbar)
2020/12/10 Python
让IE6、IE7、IE8支持CSS3的脚本
2010/07/20 HTML / CSS
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
Java面试题:为什么要用Java
2012/05/11 面试题
法人代表任命书范本
2014/06/05 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
见习报告格式范文
2014/11/08 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
秋菊打官司观后感
2015/06/03 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电
浅析MySQL如何实现事务隔离
2021/06/26 MySQL
浅谈Python中的正则表达式
2021/06/28 Python
MySQL 5.7常见数据类型
2021/07/15 MySQL
基于Redis结合SpringBoot的秒杀案例详解
2021/10/05 Redis