深入理解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 相关文章推荐
在Ajax中使用Flash实现跨域数据读取的实现方法
Dec 02 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
浅谈javascript中replace()方法
Nov 10 Javascript
js弹出对话框方式小结
Nov 17 Javascript
JS构造函数与原型prototype的区别介绍
Jul 04 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
Dec 12 Javascript
JS批量替换内容中关键词为超链接
Feb 20 Javascript
vue-router 学习快速入门
Mar 01 Javascript
javascript实现最长公共子序列实例代码
Feb 05 Javascript
Vue.js中关于侦听器(watch)的高级用法示例
May 02 Javascript
layui实现tab的添加拒绝重复的方法
Sep 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
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
javascript 利用Image对象实现的埋点(某处的点击数)统计
2012/12/28 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
2016/12/18 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
使用原生js写ajax实例(推荐)
2017/05/31 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
laydate日历控件使用方法详解
2017/11/20 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
Vue中axios的封装(报错、鉴权、跳转、拦截、提示)
2019/08/20 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
2019/09/20 Javascript
通过原生vue添加滚动加载更多功能
2019/11/21 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python模拟三级菜单效果
2017/09/11 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
电气工程师岗位职责
2014/01/01 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
2014年社区工会工作总结
2014/12/18 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
ConditionalOnProperty配置swagger不生效问题及解决
2022/06/14 Java/Android