深入理解node.js http模块


Posted in Javascript onJanuary 24, 2018

http模块主要用于搭建HTTP服务端和客户端,使用HTTP服务器或客户端功能都必须调用http模块。

创建服务器

var http = require(“http”);var url = require(“url”);//创建服务器//http继承自tcpvar server = http.createServer(function (req,res) {  var urlstr = req.url;//获取请求的路径  var urlMethod = req.method;//获取请求的方法  var urlObj = url.parse(urlstr,true);  console.log(urlObj);  
  console.log(urlMethod);  res.end(“hello”);});server.listen(8080);

对请求进行处理

请求分为两种:get和post,get请求url地址带参数,req.url便能获取参数,而post请求便复杂一些。使用req.on()处理post请求。

post请求方式:使用req.on("data"function(){})方式读取,使用str字符串拼接,在req.on("end",function(){})读取结束后输出str便是我们想得到的post请求发送的参数;

get请求方式:在请求地址上使用url.parse(req.url,true).query得到参数。

var http = require("http");
var fs = require("fs");
var url = require("url");
var querystring = require("querystring");
var server = http.createServer(function (req,res) {
  console.log(req.method);
  var pathname = url.parse(req.url,true).pathname;
  if(pathname=="/"){
  //  加载注册页面
    var rs = fs.createReadStream("post.html");
    rs.pipe(res);
  }else if(pathname=="/post"){
    // 处理post请求
    var str = "";
    req.on("data",function (chunk) {
      // console.log(chunk.toString());
      str += chunk;
    });
    req.on("end",function(){
      var postObj = querystring.parse(str);
      console.log(postObj);
    })
  }else if(pathname=="/get"){
    // get请求
    var getObj = url.parse(req.url,true).query;
    res.write(JSON.stringify(getObj));
    res.end();
  }else if(pathname!="/favicon.ico"){
    var rs = fs.createReadStream("."+pathname);
    rs.pipe(res);
  };
});
server.listen(8787);

上传文件处理

前端html代码如下:就不细说了。

<form action=“/upimg” method=“post” enctype=“multipart/form-data”>

用户名: <input type=“text” name=“user”><br> 

密码: <input type=“password” name=“pass”><br>

上传图片: <input type=“file” name=“file1”><br> 

<input type=“submit” value=“提交”></form>

想要实现文件上传,要引入formidable模块var formidable = require("formidable");若是没有此模块,在终端输入 npm install formidable安装。

form.parse(req,function(err,fields,fies){})方法回调函数的三个参数

  1. err:返回错误信息
  2. fields:post请求返回的字段以及对应的值
  3. fies:上传的文件对象,对象中包含文件的很多详细信息

得到文件信息后,使用数据流的读和写复制文件

var http = require("http");
var fs = require("fs");
var url = require("url");
// 文件上传
var formidable = require("formidable");
var server = http.createServer(function(req,res){
  var pathname = url.parse(req.url,true).pathname;
  if(pathname=="/"){
    var rs = fs.createReadStream("uploads.html");
    rs.pipe(res);
  }else if(pathname=="/uploads"){
    // 实例化一个formidable类
    var form = new formidable.IncomingForm();
   // 调用parse方法
    form.parse(req,function(err,fields,files){
      if(err){
        return console.log(err);
      }else{
        // console.log("字段",fields);
        // 存储字段
        var fieldStr = JSON.stringify(fields);
        fs.writeFileSync("1.txt",fieldStr);
        // 转存文件
        if(!fs.existsSync("uploads")){
          fs.mkdir("uploads");
        }
       // 随机路径
        var filePath = files.img.path;
        var rs = fs.createReadStream(filePath);
        var ws = fs.createWriteStream("./uploads/"+files.img.name);
        rs.pipe(ws);
        rs.on("data",function (chunk) {
          
        })
        rs.on("end",function(){
          console.log("复制成功");
          res.write("上传成功");
          res.end();
        })
        res.setHeader("Content-type","text/html;charset=utf8");  
        console.log("文件",files);
      }
    })

  }else if(pathname!="/favicon.ico"){
    var rs = fs.createReadStream("."+pathname);
    rs.pipe(res);
  }
});
server.listen(8880);

http模拟客户端

主要是options的配置,最基本的参数如下面的代码块。

  1. method:说明请求方式;
  2. host: 服务器ip,这里以本地localhost为例;
  3. port:服务器端口号;
  4. path:请求路径;

此时不在使用http.createServer()创建服务器了,而是使用http.request()请求服务器,其余的都和服务器差不多了。

// 通过nodejs模拟客户端
var http = require("http");
var options = {
  method:"post",
  host:"localhost",
  port:2121,
  path:"/"
};
var request = http.request(options,function (res) {
  var str = "";
  res.on("data",function(chunk){
    str += chunk;
  });
  res.on("end",function () {
    console.log(str);
  })
});
var obj = {
  name:"李四",
  age:20
}
request.write(JSON.stringify(obj));
request.end();

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

Javascript 相关文章推荐
基于jquery的横向滚动条(滑动条)
Feb 24 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
禁止ajax缓存获取程序最新数据的方法
Nov 19 Javascript
js中arguments的用法(实例讲解)
Nov 30 Javascript
JavaScript事件委托的技术原理探讨示例
Apr 17 Javascript
Javascript中arguments和arguments.callee的区别浅析
Apr 24 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
Jun 07 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
Jul 27 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
Aug 28 jQuery
深入理解Angular4订阅(Subscribe)与取消
Nov 22 Javascript
JS中原始值和引用值的储存方式示例详解
Mar 23 Javascript
Node.js console控制台简单用法分析
Jan 04 Javascript
微信、QQ、微博、Safari中使用js唤起App
Jan 24 #Javascript
基于node打包可执行文件工具_Pkg使用心得分享
Jan 24 #Javascript
Angular整合zTree的示例代码
Jan 24 #Javascript
使用classList来实现两个按钮样式的切换方法
Jan 24 #Javascript
基于vue.js 2.x的虚拟滚动条的示例代码
Jan 23 #Javascript
AngularJS基于http请求实现下载php生成的excel文件功能示例
Jan 23 #Javascript
简述vue中的config配置
Jan 23 #Javascript
You might like
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
怎么使 Mysql 数据同步
2006/10/09 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
2019/11/26 PHP
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
ANT 压缩(去掉空格/注释)JS文件可提高js运行速度
2013/04/15 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
angular.bind使用心得
2015/10/26 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
一种新的javascript对象创建方式Object.create()
2015/12/28 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
JavaScript实现打砖块游戏
2020/02/25 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
python中 logging的使用详解
2017/10/25 Python
python 数字类型和字符串类型的相互转换实例
2018/07/17 Python
python3 flask实现文件上传功能
2020/03/20 Python
Python基础教程之异常详解
2019/01/10 Python
python学生管理系统
2019/01/30 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
德国苹果商店:MacTrade
2020/05/18 全球购物
怎样从/向数据文件读/写结构
2014/11/23 面试题
中药专业大学生医药工作求职信
2013/10/25 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
关于React Native使用axios进行网络请求的方法
2021/08/02 Javascript