nodeJS入门04-post请求

post请求

POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。

比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。

一个post请求的小实例:(代码地址:https://github.com/xuxiaozhi/nodeJS-tutorial.git

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://127.0.0.1:8080/dopost" method="post">
    <p>姓名:<input type="text" name="name"></p>
    <p>年龄:<input type="text" name="age"></p>
    <p><input type="submit" value="提交"></p>
</form>
</body>
</html>

服务端代码:

var http=require("http");
var queryString=require("querystring");
var server=http.createServer(function (req,res) {
    if(req.url=="/dopost"&&req.method.toLocaleLowerCase()=="post"){

        // 定义了一个post变量,用于暂存请求体的信息
        var allData="";

        //通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
        req.addListener("data",function (chunk) {
            allData+=chunk;
        })

        //在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
        req.addListener("end",function () {
            var dataString=allData.toString();
            var dataObj=queryString.parse(dataString);
            res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"})
            res.write(dataObj.name+"的年龄是:"+dataObj.age);
            res.end();
        })
    }
})

server.listen(8080,"127.0.0.1");

运行结果:

原生写POST处理,比较复杂,要写两个监听。文件上传业务比较难写。所以,我们用到第三方模块。formidable。

api地址:https://www.npmjs.com/package/formidable

 因为这个是一个第三方的模块,所以我们在使用到这个模块的时候需要先安装这个模块 :安装这个模块用的是npm install formidable命令

cmd命令:

 安装好之后,我们在我们的项目里面,会看到一个node_modules文件夹,下载的模块就在这个文件夹中,如下:

 

 上面的例子用formidable来监听提交数据

var http=require("http");
var queryString=require("querystring");
var formidable=require("formidable");
var server=http.createServer(function (req,res) {
    if(req.url=="/dopost"&&req.method.toLocaleLowerCase()=="post"){
        // parse a file upload
        var form = new formidable.IncomingForm();
         //执行里面的回调函数的时候,表单已经全部接收完毕了
        //所有的文本域,单选框,都在fields存放
        //所有的文件域,files
        form.parse(req, function(err, fields, files) {
            console.log(fields);
            console.log(files);
            res.writeHead(200, {'content-type': 'text/plain'});
            res.end();
        });

        return;
    }
})

server.listen(8080,"127.0.0.1");
原文地址:https://www.cnblogs.com/xuxiaozhi/p/7928524.html