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 相关文章推荐
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 NodeJs
nodejs中全局变量的实例解析
Mar 07 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
nodejs取得当前执行路径的方法
May 13 NodeJs
nodejs 使用 js 模块的方法实例详解
Dec 04 NodeJs
详解Nodejs get获取远程服务器接口数据
Mar 26 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 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 日期时间函数的高级应用技巧
2009/10/10 PHP
php实现的ping端口函数实例
2014/11/12 PHP
Symfony2开发之控制器用法实例分析
2016/02/05 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
js 获取Listbox选择的值的代码
2010/04/15 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
js电话号码验证方法
2015/09/28 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
2016/01/18 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
JS使用正则表达式提交页面验证的代码
2019/10/16 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
解决Django migrate No changes detected 不能创建表的问题
2018/05/27 Python
python爬虫之遍历单个域名
2019/11/20 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
2020/08/31 Python
详解Python 函数参数的拆解
2020/09/02 Python
安德玛菲律宾官网:Under Armour菲律宾
2020/07/28 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
公司出纳岗位职责
2013/12/07 职场文书
班风学风建设方案
2014/05/06 职场文书
保险公司开门红口号
2014/06/21 职场文书
2015年党建工作总结
2015/03/30 职场文书
机器人瓦力观后感
2015/06/12 职场文书