Node.js 获取GET、POST提交的数据

2023-05-16

表单提交过来的数据有两种方法,一种是GET方式提交,这种提交方法会把表单需要传输的数据写在url上,一起带过去,另一种是POST方式提交,POST方式提交会把表单数据携带在request请求正文中传递过去。

针对这两种不同的提交方法,node里也有两种不同的处理方法。先看看如果用GET方式提交,我们该怎么去处理

获取GET方式提交的数据
index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <form action="http://localhost:9998" method="get">
            <input type="text" name="user"  value="" />
            <input type="password" name="passw" value="" />
            <input type="submit" value=""/>
        </form>
    </body>
</html>

index.html只是一个简单的表单网页,两个输入框用作用户的账号和密码输入,还有一个submit用来提交。

下面是node实现

GETServer.js

var http = require("http");
var url = require("url");

function onRequest(req,resp){
    console.log(url.parse(req.url,true).query);
    //返回响应
    resp.writeHead(200,{"ContentType":"text/html;charset=utf-8"});
    resp.end();
}

//创建server
http.createServer(onRequest).listen(9998);

这样的话就获取到了表单使用GET方式提交过来的数据
其中req.url 是指req提交过来的url的路由
但是我们会发现一个问题,我们看一下console的打印情况。

{ user: 'asda', passw: 'asddasd' }
{}

我们会发现打印了两行,第二行被打印出了一个空的JSON对象。这是怎么回事呢,听老衲缓缓道来。

在第一次request请求的时候,客户端会发送一个隐式的请求给服务器,这个请求就是为了获取到网页的图标(就是每个网页打开后Title旁边的那个小图标),所以,当我们提交表单数据的时候,实际是触发了两次请求,第一次请求favicon.ico ,第二次提交数据,所以我们打印出来的结果就是两个对象。

so?那么我们应该怎样去处理它呢?我们需要在服务端过滤掉请求favicon.ico的请求。
只需加上一段这样的if就行

if(req.url != "/favicon.ico"){
    console.log(url.parse(req.url,true).query);
}

这样的话我们再看一下console的打印结果是不是正常了

{ user: 'asda', passw: 'asddasd' }

获取POST方式提交的数据

开头我也说过了,用POST方式提交的数据会附带在请求正文里面,所以我们需要获取到附带在request正文里的信息,那具体是怎么做呢?

index.html

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <form action="http://localhost:9998" method="post">
            <input type="text" name="user"  value="" />
            <input type="password" name="passw" value="" />
            <input type="submit" value=""/>
        </form>
    </body>
</html>

这里只做了简单的修改,把method 从get改为post

POSTServer.js

/**
 * New node file
 */

var http = require("http");
var queryString = require("querystring");

function onRequest(req,resp){
    //过滤掉favicon请求
    if(req.url != "/favicon.ico"){
        //post请求 获取表单数据
        var obj = null;
        var currentData = "";
        req.on("data",function(data){
            currentData += data;
            obj = queryString.parse(currentData);
        });
        console.log(obj);
        resp.writeHead(200,{"ContentType":"text/html;charset=utf-8"});
        resp.end();
    }
}


//创建server
http.createServer(onRequest).listen(9998);

上面的querystring.parse就能直接把获取到的数据转换成JSON对象。
接下来我们来看看控制台是怎么打印的

null

what!?

为什么是null!?
这就说明如果要学习Node就得改掉我们写java ,写C/C++ 那些非异步的语言的编程习惯,因为这里的原因之所以是Null是因为Node本身机制的原因

Node的快就在于它处处存在异步,存在回调,基于观察者模式于一身的美男子。
这里我不得不说一下Node的异步运行机制。

整个Node程序在执行的过程中,遇到了sync Event 也就是同步事件,然后解释器会把它交给一个叫做事件栈(Event Stack)的数据结构,这个栈会不断的去push同步代码,然后执行完毕后pop出来。当程序遇到异步事件(async Event)的时候,会把它交给别的地方来处理,处理完毕后将结果返回至事件队列(Event Queue),当Event Stack空闲的时候,就会让一个Loop来挨个挨个将事件队列中的事件取出来,放入事件栈里执行回调。

这时我们就可以解释为什么是null了,因为request 绑定了一个名为data的异步事件,但是我们console.log(obj);是sync的,所以解释器会先打印出obj的值,再去事件队列中取出来放到事件栈中去执行回调,虽然我们代码顺序是先赋值,再打印,而结果却出乎我们意料,是先打印再赋值,对于这种情况的解决办法,我们初步可以调用setTimeout的方法来解决它。setTimeout() 是一个延迟执行的函数,用它可以将我们的console.log(obj);放入队列尾,这样的话,我们就能够实现先赋值再打印了,当然这样会降低程序的效率。

我们来修改一下程序的代码

POSTServer.js
 

/**
 * New node file
 */

var http = require("http");
var queryString = require("querystring");

function onRequest(req,resp){
    //过滤掉favicon请求
    if(req.url != "/favicon.ico"){
        //post请求 获取表单数据
        var obj = null;
        var currentData = "";
        req.on("data",function(data){
            currentData += data;
            obj = queryString.parse(currentData);
        });
        setTimeout(function(){
            console.log(obj);
        },1000);
        resp.writeHead(200,{"ContentType":"text/html;charset=utf-8"});
        resp.end();
    }
}


//创建server
http.createServer(onRequest).listen(9998);

这样的话我们就能看到console打印出来的正常的结果。

{ user: 'asda', passw: 'asddasd' }

完美处理POST、GET请求

接下来我们结合两种方法来实现不管POST,GET提交的方式我们都能处理。

GETPOSTServer.js

/**
 * New node file
 */

var http = require("http");
var url = require("url");
var queryString = require("querystring");

function onRequest(req,resp){
    //过滤掉favicon请求
    if(req.url != "/favicon.ico"){
        //需要的json对象
        var obj = null;
        //区分get post 请求
        if(req.method == "GET"){
            obj = url.parse(req.url,true).query;
        }
        else{
            //post请求 获取表单数据
            var currentData = "";
            req.on("data",function(data){
                currentData += data;
                obj = queryString.parse(currentData);
            });
        }
        //添加进事件队列
        setTimeout(function(){
            console.log(obj);
        },1000);
        write(resp);

    }
}

function write(resp){
    resp.writeHead(200,{"ContentType":"text/html;charset=utf-8"});
    resp.end();
}


//创建server
http.createServer(onRequest).listen(9998);

另外:

nodejs对于post请求和get请求的获取方式不一样。

1.get请求

用url模块处理req.url就能够获取get参数

var url = require("url");
//params就是get方法携带的参数
var params = url.parse(req.url, true).query;

2.post请求

Post由于它的重量,所以不可能说接收就接收,它会存储接入中和接入完成两种状态,两种状态对应着回调方法,即,当然数据处于接入中状态时,处理一种流程;当数据接入完成后,处理另一种流程。

   var postData = ""; 
    // 数据块接收中
    req.addListener("data", function (postDataChunk) {
        postData += postDataChunk;
    });
    // 数据接收完毕,执行回调函数
    req.addListener("end", function () {
        var params = querystring.parse(postData);
        console.log(params);
    });

以上node事件监听当中的on和addListener的区别

没有区别,EventEmitter.prototype.on = EventEmitter.prototype.addListener;    

 

 

转载于:
————————————————
版权声明:本文为CSDN博主「小辣抓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/HaoDaWang/article/details/53024122


关于  js  异步的文章  请见这篇博客:

https://zhuanlan.zhihu.com/p/78816710

https://blog.csdn.net/qq_41601836/article/details/117230359

 

 

乐于分享

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 获取GET、POST提交的数据 的相关文章

  • 同时使用 POST 和 GET 的 HttpWebRequest

    我需要将用户重定向到http www someurl com id 2 http www someurl com id 2使用 POST 方法 是否可以 如果是 那么如何 现在我有以下内容 它正确转发 POST 数据 但它删除了 id 2
  • 使用 libsoup 进行 HTTP POST

    我想使用 libsoup 执行一个简单的 POST 请求 我想要发送数据的网站的 api 只需要一个名为 内容 的字段 使用curl我这样做 curl si F content mycontent http mywebsite org ap
  • Android Volley POST Json 到服务器

    我正在使用 Volley 在 Android 设备和网络服务器之间传输数据 我发现有关将数据列表发送到服务器的问题 例如 我的类将生成如下数据集 1 1 aID 5 2 aID 5 3 aID 5 4 aID 5 2 1 bID 3 2 b
  • 组件返回故障代码:0x805e0006 错误

    下面的 JQueryget call var doc root document location hostname 8082 var fw script doc root sites MyScripts fw2 php var langp
  • 无法获取POST参数

    我正在使用 WebApp2 作为框架在 Python 中开发一个 Web 应用程序 我无法获取通过填写表单提交的http POST请求参数 这是我创建的表单的 HTML 代码
  • 对于 .com 电子邮件地址,获取请求失败,因为 Spring 将其解释为扩展名

    参见下面2015年8月20日的编辑部分 我最近也遇到了类似的问题 获取请求仅适用于尾部斜杠 Spring REST 注释 https stackoverflow com questions 31117009 get request only
  • Laravel 输入:get() 不起作用

    我正在尝试在 Laravel 4 中使用 post 函数 我的表单有许多字段 在提交时 会转到控制器中的 post 函数 问题是 表单中的字段名称之间有空格 例如 Type 1 是输入的名称 中间有一个空格 现在 当我尝试通过执行以下操作来
  • 如何循环 $_POST 将每个帖子字段作为参数传递给函数?编辑[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将数据从 jQuery 传递到 PHP 以进行 ajax post

    你好 我是一个使用 jQuery 和 Ajax 的新手 我正在尝试使用 Jquery POST 方法将数据提交到服务器 我传递的数据是一个字符串 现在我无法理解如何传递数据以及如何检索数据 我尝试搜索有关我的问题的文章 但没有找到 我相信我
  • 使用 net/http 发送 Post 请求

    我需要将 JSON 数据发送到同一台计算机上运行的另一个应用程序 我像这样发送请求 rails 3 2 13 data some data hash url URI parse http localhost 6379 api plans r
  • 使用哈希检查具有 $_POST 值的页面是否已刷新

    当将表单发布到同一个PHP页面时 正确的方法是什么来查找页面是否被意外刷新而不是再次提交 这是我现在正在使用的 tmp implode POST myHash md5 tmp if isset SESSION myHash SESSION
  • Android - 使用 HttpURLConnection 来 POST XML 数据

    我遇到了一些死胡同 需要一些帮助 请 我对 Android 开发 以及一般编码 非常陌生 基本上我需要使用 HttpURLConnection 将 XML 数据发布到 URL 但无法让它工作 我的应用程序从 GET 请求读取并传递 XML
  • 发布后忽略基本标签

    在 Chrome 上我收到错误Refused to execute a JavaScript script Source code of script found within request 在发布包含域名的数据后 另请注意任一页面上都缺
  • iOS 安全性将带有密码的数据发送至服务器或从服务器发送数据

    我正在构建一个应用程序 需要在服务器执行任何操作之前从用户设备发送密码以在服务器上进行身份验证 事情是这样的 用户的手机上有一个纯文本密码 该密码也在服务器中以 bcrypt 二进制文件的形式存在 用户想要从数据库中获取某些内容 因此用户通
  • IPV6 Curl POST 请求

    在 IPV6 中 如何使用 IPV6 地址和端口号构建 CURL POST http 请求 任何类型的线程都将受到赞赏 尝试构建如下请求 gt curl interface http 2001 0 db8 1111 0 0 0 11 809
  • WordPress 按标题获取帖子,例如

    我正在尝试为 WordPress 创建一个小型搜索功能 AJAX 调用应该获取标题类似的所有帖子 quote 是否有可能在内部实现这种情况get posts 功能 别误会我的意思 阿贾克斯工作正常 我的functions php 中有aja
  • 使用 PHP 将表单数据发送/发布到 URL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个通过 POST 提交的表单 提交表单后我捕获变量 如何连接表单数据 然后将其 POST 到 url 然后重新定向到感谢页面 这不是确
  • MS Access 执行 POST Web 请求

    在我的 MS Access 应用程序中 我需要定期向我的网络服务器发送一批信息 我不需要任何花哨的东西 比如 SOAP XML RPC 或任何东西 只需一个简单的 POST 页面请求就足够了 我用谷歌搜索了一下 但找不到任何真正有用的东西
  • 使用python将json和文件发送到flask

    我遇到这个问题 我试图在单个函数中向 Flask API 发送 接收一些文件和 JSON 在我的客户端 发件人 上我有 my json to be sent datas var1 var1 var2 var2 my file to be s
  • 请参阅 Java EE eclipse 调试中的 POST 参数

    我在调试 Java EE 方面没有经验 我更像是一个 javascript 人 我需要查看哪些 HTTP POST 参数到达服务器端 我在表单将其操作指向的 jsp 文件中放置了一个断点 现在我在调试变量窗口中找不到 POST 内容 他们在

随机推荐

  • HAL库开启串口空闲中断

    串口接收数据时 xff0c 开启空闲中断后可在接收完成触发中断 xff0c 再去做进一步处理 xff0c 但找了半天没找掉HAL库的使能某中断的函数 xff0c 以及判断是哪个中断触发的函数 xff0c 原来在stm32f4xx hal u
  • debug成长记录

    提示 xff1a 今天编译代码时 xff0c 出现了错误 function definition is not allowed here 描述 xff1a 在函数调用时也找不到已经定义的函数 但明明已经定义了 xff0c 并且路径也没有问题
  • 【rotors】多旋翼无人机仿真(五)——多无人机仿真

    rotors 多旋翼无人机仿真 xff08 一 xff09 搭建rotors仿真环境 rotors 多旋翼无人机仿真 xff08 二 xff09 设置飞行轨迹 rotors 多旋翼无人机仿真 xff08 三 xff09 SE3控制 roto
  • linux分区不该把/usr独立分出来

    manjaro arch 安装完成后重启报错 xff1a Root device mounted successfully but sbin init does not exist 前言 这个问题是我的大佬同学赖拐发现的 xff0c 估计也
  • Linux与Windows 10用grub引导教程

    前言 去年暑假的时候 xff0c 写了一篇如何装 Linux 和 Windows 10 双系统的文章发在了简书上 xff0c 我写这篇文章的原因是当初装双系统确实是折腾了许久 xff0c 网上也找不到一篇详尽的教程 由于去年对于写教程还不是
  • 如何在Ubuntu 20.04上安装Wine 5.0

    如何在Ubuntu 20 04上安装Wine 5 0 Wine是一款开源的应用程序 xff0c 它提供了在类似Unix的操作系统上运行为微软Windows开发的软件的兼容性 在Wine的帮助下 xff0c 你可以在Linux系统上运行Win
  • 如何在Ubuntu 20.04上安装Kvm

    在继续安装之前 xff0c 请确保您的Ubuntu主机支持KVM虚拟化 系统应具有带VT x xff08 vmx xff09 的Intel处理器或具有AMD V xff08 svm xff09 技术支持的AMD处理器 运行以下grep命令以
  • 安装KVM+安装虚拟机+配置桥接网络

    由于很久没有玩虚拟机了 xff0c 有些生疏 xff0c 百度了一下 xff0c 结果百度出来的文章动不动就让安装一大堆东西 xff0c 不管用上用不 xff0c 而且我还惊奇的发现这些让安装一大堆东西的博客基本都相同 xff0c 你说奇不
  • win10通过pe修复uefi引导后bootmanage出现两个引导项很烦人

    解决办法 xff1a 1 xff0c 进入win10桌面后按win 43 r召唤出运行窗口 2 xff0c 输入msconfig 按回车 3 xff0c 删除不想要的引导选项 重启应该就可以直接进入系统了
  • 安装黑苹果遇到的问题(为什么出现禁止符号,为什么无法从硬盘启动)

    博客网址 xff1a https macx top 10442 html
  • macOS原生支持NTFS读写的方法

    详细流程 xff1a 插上硬盘后 xff0c 查看你的硬盘名称 xff0c 这里假设名称是AngleDisk 打开Applications的Terminal在终端输入sudo nano etc fstab 敲击回车 现在你看到了一个编辑界面
  • Mac M1 安装brew 国内源

    1 command 43 space 打开搜索 2 输入terminal找到终端点击打开 3 拷贝以下代码放置到终端并回车 bin zsh c 34 curl fsSL https gitee com huwei1024 HomebrewC
  • 日语的-自-他动词区分

  • Sophus库安装和使用

    1 前言 Sophus库是一个较好的李群和李代数的C 43 43 库 xff0c 它很好的支持了SO 3 so 3 SE 3 和se 3 Sophus库是基于Eigen基础上开发的 xff0c 继承了Eigen库中的定义的各个类 因此在使用
  • 打开cmd后默认进入conda的base环境的解决办法

    解决方案 xff1a 命令行执行 xff1a xff08 取消默认加载环境 xff09 conda config set auto activate base false 次级解决方案 xff1a 修改 vim xff5e bashrc x
  • 数据库范式的一些理解

    一 假设一个表R 61 X xff0c Y xff0c Z xff0c 其中X Y Z是三个属性组 xff0c X是码 再假设R不符合3NF xff0c 即 xff1a X gt Y xff0c Y gt Z xff0c 其中Y不是码 xf
  • matlab修改默认当前文件夹

    操作步骤 找到 matlabrc m 文件 cd 39 Matalb的安装路径 39 cd toolbox local 编辑 matlabrc m 文件 在文件末尾添加打开时要转到的目录 xff0c 比如 xff1a cd 39 C Use
  • nvm下载各node版本时使用淘宝的镜像

    在nvm安装目录下的settings txt里 xff0c 添加如下两行代码 xff1a node mirror https npm taobao org mirrors node npm mirror https npm taobao o
  • conda清除无用安装包

    conda clean p 删除缓存 conda clean y all 删除pkgs目录下所有的无用安装包及cache
  • Node.js 获取GET、POST提交的数据

    表单提交过来的数据有两种方法 xff0c 一种是GET方式提交 xff0c 这种提交方法会把表单需要传输的数据写在url上 xff0c 一起带过去 xff0c 另一种是POST方式提交 xff0c POST方式提交会把表单数据携带在requ