深入理解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 相关文章推荐
jquery星级插件、支持页面中多次使用
Mar 25 Javascript
js分解url参数(面向对象-极简主义法应用)
Aug 09 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
May 26 Javascript
javascript移出节点removeChild()使用介绍
Apr 03 Javascript
SyntaxHighlighter 3.0.83使用笔记
Jan 26 Javascript
javascript实现youku的视频代码自适应宽度
May 25 Javascript
js面向对象的写法
Feb 19 Javascript
JavaScript事件学习小结(五)js中事件类型之鼠标事件
Jun 09 Javascript
vue 解决addRoutes动态添加路由后刷新失效问题
Jul 02 Javascript
Angular7创建项目、组件、服务以及服务的使用
Feb 19 Javascript
js this 绑定机制深入详解
Apr 30 Javascript
微信小程序实现分页加载效果
Nov 19 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
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
2011/01/06 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
PHP微框架Dispatch简介
2014/06/12 PHP
destoon之一键登录设置
2014/06/21 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
PHP PDOStatement::errorInfo讲解
2019/01/31 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
js作用域及作用域链概念理解及使用
2013/04/15 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
nodejs实现连接mongodb数据库的方法示例
2018/03/15 NodeJs
Java 生成随机字符的示例代码
2021/01/13 Javascript
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
python人民币小写转大写辅助工具
2018/06/20 Python
python数据结构之线性表的顺序存储结构
2018/09/28 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
美国婴儿服装购物网站:Gerber Childrenswear
2020/05/06 全球购物
Chemist Warehouse中文网:澳洲连锁大药房
2021/02/05 全球购物
2014年卫生保健工作总结
2014/12/08 职场文书
二手车转让协议书
2015/01/29 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
Win11更新失败并提示0xc1900101
2022/04/19 数码科技