深入理解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 相关文章推荐
dojo 之基础篇(三)之向服务器发送数据
Mar 24 Javascript
js停止输出代码
Jul 20 Javascript
javascript 程序库的比较(一)之DOM功能
Apr 07 Javascript
JavaScript栏目列表隐藏/显示简单实现
Apr 03 Javascript
JS 实现计算器详解及实例代码(一)
Jan 08 Javascript
Vuejs 页面的区域化与组件封装的实现
Sep 11 Javascript
Vue实现web分页组件详解
Nov 28 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
Mar 21 Javascript
jQuery实现消息弹出框效果
Dec 10 jQuery
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
Aug 06 Javascript
js实现贪吃蛇游戏 canvas绘制地图
Sep 09 Javascript
关于Vue Router的10条高级技巧总结
May 06 Vue.js
微信、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 Document 代码注释规范
2009/04/13 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
php编程每天必学之验证码
2016/03/03 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
让getElementsByName适应IE和firefox的方法
2007/09/24 Javascript
My Desktop :) 桌面式代码
2008/12/29 Javascript
js 字符串操作函数
2009/07/25 Javascript
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
Bootstrap每天必学之导航条
2015/11/27 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
Nest.js 授权验证的方法示例
2021/02/22 Javascript
浅析使用Python操作文件
2017/07/31 Python
python实现学生管理系统
2018/01/11 Python
python修改linux中文件(文件夹)的权限属性操作
2020/03/05 Python
tensorflow实现残差网络方式(mnist数据集)
2020/05/26 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
python 如何对logging日志封装
2020/12/02 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
俄罗斯连接商品和买家的在线平台:goods.ru
2020/11/30 全球购物
高中军训感想800字
2014/02/23 职场文书
就业意向书范文
2014/04/01 职场文书
工商干部先进事迹
2014/05/14 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
答谢酒会主持词
2015/07/02 职场文书
干部理论学习心得体会
2016/01/21 职场文书
2016年师德先进个人事迹材料
2016/02/29 职场文书