深入理解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 相关文章推荐
JavaScript表单通过正则表达式验证电话号码
Mar 14 Javascript
JavaScript使用addEventListener添加事件监听用法实例
Jun 01 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
Nov 09 Javascript
总结JavaScript三种数据存储方式之间的区别
May 03 Javascript
用JavaScript实现让浏览器停止载入页面的方法
Jan 19 Javascript
js实现百度搜索提示框
Feb 05 Javascript
JS实现的自动打字效果示例
Mar 10 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
May 19 jQuery
jsTree事件和交互以及插件plugins详解
Aug 29 Javascript
jQuery时间戳和日期相互转换操作示例
Dec 07 jQuery
vue中格式化时间过滤器代码实例
Apr 17 Javascript
详细分析React 表单与事件
Jul 08 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
怎样在php中使用PDF文档功能
2006/10/09 PHP
apache mysql php 源码编译使用方法
2012/05/03 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
Yii2实现多域名跨域同步登录退出
2017/02/04 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
javascript中typeof的使用示例
2013/12/19 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
jQuery中bind()方法用法实例
2015/01/19 Javascript
javascript实现连续赋值
2015/08/10 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
2016/01/04 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
JS作用域链详解
2017/06/26 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
JS实现网站吸顶条
2020/01/08 Javascript
[01:01:52]完美世界DOTA2联赛PWL S2 GXR vs Magma 第二场 11.25
2020/11/26 DOTA
Python将xml和xsl转换为html的方法
2015/03/10 Python
python实现bucket排序算法实例分析
2015/05/04 Python
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
python语言中with as的用法使用详解
2018/02/23 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
分层教学实施方案
2014/03/19 职场文书
小学三年级学生评语
2014/04/22 职场文书
校庆标语集锦
2014/06/25 职场文书
毕业生找工作自荐书
2014/06/30 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
员工离职感谢信
2015/01/22 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python
HTML+css盒子模型案例(圆,半圆等)“border-radius” 简单易上手
2021/05/10 HTML / CSS