深入理解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 相关文章推荐
js AspxButton的客户端操作
Jun 26 Javascript
20条学习javascript的编程规范的建议
Nov 28 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
Oct 15 Javascript
JS、jQuery中select的用法详解
Apr 21 Javascript
JS原型与原型链的深入理解
Feb 15 Javascript
jquery设置css样式的多种方法(总结)
Feb 21 Javascript
JS实现汉字与Unicode码相互转换的方法详解
Apr 28 Javascript
微信小程序 同步请求授权的详解
Aug 04 Javascript
Express之托管静态文件的方法
Jun 01 Javascript
LayerClose弹窗关闭刷新方法
Aug 17 Javascript
react写一个select组件的实现代码
Apr 03 Javascript
微信小程序实现搜索历史功能
Mar 26 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将数据库中的电话号码读取出来并生成图片
2008/08/31 PHP
php实现查看邮件是否已被阅读的方法
2013/12/03 PHP
PHP程序员基本要求和必备技能
2014/05/09 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
Python方法的延迟加载的示例代码
2017/12/18 Python
pandas求两个表格不相交的集合方法
2018/12/08 Python
【python】matplotlib动态显示详解
2019/04/11 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
2019/08/28 Python
Python图片的横坐标汉字实例
2019/12/04 Python
Python闭包及装饰器运行原理解析
2020/06/17 Python
CSS3实现复选框动画特效示例代码
2016/09/27 HTML / CSS
KARATOV珠宝在线商店:俄罗斯珠宝品牌
2019/03/13 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
简单的项目建议书模板
2014/03/12 职场文书
餐饮服务食品安全责任书
2014/07/25 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
退伍军人感言
2015/08/01 职场文书
PHP解决高并发问题
2021/04/01 PHP
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python
MySQL系列之十一 日志记录
2021/07/02 MySQL
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技
Java 死锁解决方案
2022/05/11 Java/Android