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 相关文章推荐
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
Nodejs的express使用教程
Nov 23 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
Nodejs文件上传、监听上传进度的代码
Mar 27 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获取当前页面完整URL的实现代码
2013/06/10 PHP
基于php和mysql的简单的dao类实现crud操作功能
2014/01/27 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
js null undefined 空区别说明
2010/06/13 Javascript
js输出列表实现代码
2010/09/12 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
javascript随机之洗牌算法深入分析
2014/06/07 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
2017/09/05 Javascript
vue按需引入element Transfer 穿梭框
2017/09/30 Javascript
vue获取dom元素注意事项
2017/12/28 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
python标准算法实现数组全排列的方法
2015/03/17 Python
整理Python最基本的操作字典的方法
2015/04/24 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
html5 div布局与table布局详解
2016/11/16 HTML / CSS
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
英国在线药房和在线医生:LloydsPharmacy
2019/10/21 全球购物
自考生毕业自我鉴定
2013/10/10 职场文书
毕业生的自我评价分享
2013/12/18 职场文书
商铺租房协议书范本
2014/12/04 职场文书
丽江古城导游词
2015/02/03 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
Python中npy和mat文件的保存与读取
2022/04/24 Python
MySQL使用IF语句及用case语句对条件并结果进行判断 
2022/09/23 MySQL