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全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs教程之环境安装及运行
Nov 21 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
Nodejs下用submit提交表单提示cannot post错误的解决方法
Nov 21 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
详解Nodejs内存治理
May 13 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
Nodejs + sequelize 实现增删改查操作
Nov 07 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
许愿墙中用到的函数
2006/10/07 Javascript
js小技巧--自动隐藏红叉叉
2007/08/13 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
了不起的node.js读书笔记之node的学习总结
2014/12/22 Javascript
js实现可折叠展开的手风琴菜单效果
2015/09/07 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
JavaScript继承学习笔记【新手必看】
2016/05/10 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
2017/02/18 Javascript
js实现功能比较全面的全选和多选
2017/03/02 Javascript
VsCode新建VueJs项目的详细步骤
2017/09/23 Javascript
js调用设备摄像头的方法
2018/07/19 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
python从zip中删除指定后缀文件(推荐)
2019/12/05 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
用python对excel查重
2020/12/07 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
异步传递消息系统的作用
2016/05/01 面试题
高中毕业自我评价
2014/02/08 职场文书
2014年减负工作总结
2014/12/10 职场文书
2015年实习班主任工作总结
2015/04/23 职场文书
不同意离婚上诉状
2015/05/23 职场文书
金榜题名主持词
2015/07/02 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
python如何利用cv2模块读取显示保存图片
2021/06/04 Python