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中SSL服务的性能
Jul 15 NodeJs
Nodejs如何搭建Web服务器
Mar 28 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
详解nodejs解压版安装和配置(带有搭建前端项目脚手架)
Dec 06 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
使用nodejs分离html文件里的js和css详解
Apr 12 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 NodeJs
如何利用nodejs自动定时发送邮件提醒(超实用)
Dec 01 NodeJs
Nodejs实现微信分账的示例代码
Jan 19 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
ajax 的post方法实例(带循环)
2011/07/04 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
php学习笔记之面向对象
2014/11/08 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
php使用curl实现ftp文件下载功能
2017/05/16 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
简单谈谈Javascript中类型的判断
2015/10/19 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
vue实现将一个数组内的相同数据进行合并
2019/11/07 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
Python中的Classes和Metaclasses详解
2015/04/02 Python
基于python中theano库的线性回归
2018/08/31 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
FOREO官方网站:LUNA露娜洁面仪
2016/11/28 全球购物
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
安全生产投入制度
2014/01/29 职场文书
小学师德标兵先进事迹材料
2014/05/25 职场文书
高中同学会活动方案
2014/08/14 职场文书
会计求职自荐信
2015/03/26 职场文书
上诉答辩状范文
2015/05/22 职场文书