深入理解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获得选中文本内容的方法
Dec 02 Javascript
javascript 简单抽屉效果的实现代码
Mar 09 Javascript
为你的网站增加亮点的9款jQuery插件推荐
May 03 Javascript
javascript 常用功能总结
Mar 18 Javascript
JS中类或对象的定义说明
Mar 10 Javascript
jQuery中clone()方法用法实例
Jan 16 Javascript
实现高性能JavaScript之执行与加载
Jan 30 Javascript
JavaScript模拟鼠标右键菜单效果
Dec 08 Javascript
js表单验证实例讲解
Mar 31 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
May 25 Javascript
通过一次报错详细谈谈Point事件
May 17 Javascript
JavaScript流程控制(循环)
Dec 06 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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
用PHP提取中英文词语以及数字的首字母的方法介绍
2013/04/23 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
2017/11/20 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jQuery+PHP实现动态数字展示特效
2015/03/14 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
详解vue更改头像功能实现
2019/04/28 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
python实现简单神经网络算法
2018/03/10 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
HTML5教程之html 5 本地数据库(Web Sql Database)
2014/04/03 HTML / CSS
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
成功的酒店创业计划书
2013/12/27 职场文书
迎新晚会策划方案
2014/06/13 职场文书
2014年话务员工作总结
2014/11/19 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书