深入理解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 相关文章推荐
IE FF OPERA都可用的弹出层实现代码
Sep 29 Javascript
基于jquery的超简单上下翻
Apr 20 Javascript
超简单的jquery的AJAX用法
May 10 Javascript
拉动滚动条加载数据的jquery代码
May 03 Javascript
node.js中的buffer.write方法使用说明
Dec 10 Javascript
JavaScript面试题大全(推荐)
Sep 22 Javascript
jQuery Ajax File Upload实例源码
Dec 12 Javascript
Angular.JS中select下拉框设置value的方法
Jun 20 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
Sep 13 Javascript
jQuery表单元素过滤选择器用法实例分析
Feb 20 jQuery
jquery中为什么能用$操作
Jun 18 jQuery
layui富文本编辑器前端无法取值的解决方法
Sep 18 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+AJAX传送中文会导致乱码的问题的解决方法
2008/09/08 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
Vue头像处理方案小结
2018/07/26 Javascript
Javascript的this详解
2019/03/23 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
2020/11/05 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
介绍一下Ruby的多线程处理
2013/02/01 面试题
Laravel中Kafka的使用详解
2021/03/24 PHP
中职生自荐信
2013/10/13 职场文书
体育课外活动总结
2014/07/08 职场文书
工会优秀工作者事迹
2014/08/17 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
毕业酒会致辞
2015/07/29 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python