如何在Node.js中处理POST数据?


636

如何form[method="post"]Node.js中的HTTP POST方法提取表单数据()和文件上传?

我已经阅读了文档,谷歌搜索并没有发现任何东西。

function (request, response) {
    //request.post????
}

有图书馆还是黑客?

Answers:


551

如果使用Express(用于Node.js的高性能,高级Web开发),则可以执行以下操作:

HTML:

<form method="post" action="/">
    <input type="text" name="user[name]">
    <input type="text" name="user[email]">
    <input type="submit" value="Submit">
</form>

API客户端:

fetch('/', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        user: {
            name: "John",
            email: "john@example.com"
        }
    })
});

Node.js :(自Express v4.16.0起)

// Parse URL-encoded bodies (as sent by HTML forms)
app.use(express.urlencoded());

// Parse JSON bodies (as sent by API clients)
app.use(express.json());

// Access the parse results as request.body
app.post('/', function(request, response){
    console.log(request.body.user.name);
    console.log(request.body.user.email);
});

Node.js :(适用于Express <4.16.0)

const bodyParser = require("body-parser");

/** bodyParser.urlencoded(options)
 * Parses the text as URL encoded data (which is how browsers tend to send form data from regular forms set to POST)
 * and exposes the resulting object (containing the keys and values) on req.body
 */
app.use(bodyParser.urlencoded({
    extended: true
}));

/**bodyParser.json(options)
 * Parses the text as JSON and exposes the resulting object on req.body.
 */
app.use(bodyParser.json());

app.post("/", function (req, res) {
    console.log(req.body.user.name)
});

45
如果要使用较低级别的入口点,则该功能实际上在connect的BodyParser模块中。
朱利安·伯奇

14
我糊涂了。name =“ user [email]”如何与request.body.email对应?
sbose 2012年

36
神!!我得到的疯牛病到出同一时间同一框架3个doumentations:/ nodejs.org/api/http.htmlsenchalabs.org/connectexpressjs.com/guide.html
萨尔曼·冯·阿巴斯

15
直到我添加了,这对我才起作用app.use(express.bodyParser());
小资

13
Express是节点,jQuery是客户端JS。每当我用Google搜索节点帮助时,我都会得到这些me脚的“使用快递!”。答案。解析发布数据真的很困难,以至于可以证明安装整个Web框架是合理的吗?
肖恩·惠纳

710

您可以使用以下querystring模块:

var qs = require('querystring');

function (request, response) {
    if (request.method == 'POST') {
        var body = '';

        request.on('data', function (data) {
            body += data;

            // Too much POST data, kill the connection!
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6)
                request.connection.destroy();
        });

        request.on('end', function () {
            var post = qs.parse(body);
            // use post['blah'], etc.
        });
    }
}

现在,例如,如果您有一个input名称为name 的字段age,则可以使用变量来访问它post

console.log(post.age);

8
@thejh嗯,这很不错。不过,添加它应该并不难,因此为了简化起见,我将其放在示例之外。
Casey Chu

72
node.js Web服务器开发受中间件困扰,该中间件要求您花几个小时研究它们,以节省几分钟的代码编写时间。更不用说几乎所有文档都没有提供的文档了。并且您的应用程序最终依赖于其他人而不是您自己的标准。加上许多性能问题。
Juan Lanus 2013年

4
var POST = qs.parse(body); // use POST 仅适用于像我这样的菜鸟:当输入文本字段的名称为“ user”时,Post.user将显示该字段的数据。例如console.log(Post.user);
Michael Moeller

5
您也可以使用readable回调,而不是将数据构建到主体字符串中。发射后,尸体可以通过request.read();
Thomas Fankhauser

4
请注意,req.connection.destroy(); 这不会阻止执行回调!例如,“ on end”回调将与截断的正文一起执行!这可能不是您想要的...
collimarco 2014年

149

如果有人试图淹没您的RAM,请确保终止连接!

var qs = require('querystring');

function (request, response) {
    if (request.method == 'POST') {
        var body = '';
        request.on('data', function (data) {
            body += data;
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6) { 
                // FLOOD ATTACK OR FAULTY CLIENT, NUKE REQUEST
                request.connection.destroy();
            }
        });
        request.on('end', function () {

            var POST = qs.parse(body);
            // use POST

        });
    }
}

53
您可能还会返回HTTP 413错误代码(请求实体太大)
neoascetic 2012年

1
@SSHThis:不,它是1 * 10 ^ 6 = 1000000。
thejh 2013年

@tq:在这种情况下,为POST [name](例如POST [“ foo”])。
thejh 2013年

2
var POST = qs.parse(body); // use POST 仅适用于菜鸟:当输入文本字段的名称为“ user”时,Post.user将显示该字段的数据。例如console.log(Post.user);
Michael Moeller

2
如果我张贴{'Name':'Joe'},有人可以帮忙吗,在qs.Parse(POST)之后我得到{{'Name':'Joe'}:''} ...
Matt Canty

118

这里有很多答案已经不是很好的做法,或者什么也没解释,所以这就是我写这个的原因。

基本

调用http.createServer的回调时,是服务器实际上已接收到该请求的所有标头,但有可能尚未接收到数据,因此我们必须等待。该http请求对象(http.IncomingMessage实例)实际上是一个可读 。在可读流中,每当有数据块到达时,都会发出一个事件(假设您已经注册了回调),而在所有数据块都到达时,就会发出一个事件。这是有关如何监听事件的示例:data end

http.createServer((request, response) => {
  console.log('Now we have a http message with headers but no data yet.');
  request.on('data', chunk => {
    console.log('A chunk of data has arrived: ', chunk);
  });
  request.on('end', () => {
    console.log('No more data');
  })
}).listen(8080)

将缓冲区转换为字符串

如果尝试这样做,您会注意到这些块是缓冲区。如果您不处理二进制数据,而需要使用字符串,则建议使用request.setEncoding方法,该方法将使流发出以给定编码解释的字符串,并正确处理多字节字符。

缓冲块

现在您可能对每个块都不感兴趣,因此在这种情况下,您可能想要像这样缓冲它:

http.createServer((request, response) => {
  const chunks = [];
  request.on('data', chunk => chunks.push(chunk));
  request.on('end', () => {
    const data = Buffer.concat(chunks);
    console.log('Data: ', data);
  })
}).listen(8080)

这里使用Buffer.concat,它简单地连接所有缓冲区并返回一个大缓冲区。您也可以使用concat-stream模块,该模块具有相同的功能:

const http = require('http');
const concat = require('concat-stream');
http.createServer((request, response) => {
  concat(request, data => {
    console.log('Data: ', data);
  });
}).listen(8080)

解析内容

如果您尝试接受不带文件的HTML表单POST提交或使用默认内容类型处理jQuery ajax调用,则该内容类型application/x-www-form-urlencoded具有uft-8编码。您可以使用querystring模块将其反序列化并访问属性:

const http = require('http');
const concat = require('concat-stream');
const qs = require('querystring');
http.createServer((request, response) => {
  concat(request, buffer => {
    const data = qs.parse(buffer.toString());
    console.log('Data: ', data);
  });
}).listen(8080)

如果您的内容类型是JSON,则只需使用JSON.parse而不是qs.parse即可

如果您要处理文件或处理多部分内容类型,则在这种情况下,应使用“可怕”之类的东西来消除所有麻烦。看看我的其他答案,我在其中发布了有用的链接和有关多部分内容的模块。

管道

如果您不想解析内容,而是将其传递到其他地方,例如,将其作为数据发送到另一个http请求或将其保存到文件中,我建议您对其进行管道传输而不是对其进行缓冲,因为它会少一些代码,可以更好地处理背压,它将占用更少的内存,并且在某些情况下会更快。

因此,如果要将内容保存到文件中:

 http.createServer((request, response) => {
   request.pipe(fs.createWriteStream('./request'));
 }).listen(8080)

限制数据量

正如其他答案所指出的那样,请记住,恶意客户端可能会向您发送大量数据,从而使您的应用程序崩溃或填满您的内存,以保护您确保丢弃发出数据的请求超过一定限制。如果您不使用库来处理传入的数据。我建议使用类似stream-meter的方法,如果达到指定的限制,该方法可以中止请求:

limitedStream = request.pipe(meter(1e7));
limitedStream.on('data', ...);
limitedStream.on('end', ...);

要么

request.pipe(meter(1e7)).pipe(createWriteStream(...));

要么

concat(request.pipe(meter(1e7)), ...);

NPM模块

虽然我在上面描述了如何使用HTTP请求正文来简单地缓冲和解析内容,但我建议使用这些模块之一而不是自己实现,因为它们可能会更好地处理边缘情况。为了表达意见,我建议使用body-parser。对于koa,有一个类似的模块

如果您不使用框架,那么身体会很好。


谢谢,我使用了您的代码,并且收到了神秘的重复消息。可能是该变量request被重新使用并且request.on('end')被多次调用吗?我该如何避免呢?
严景贤

在看不到您的代码的情况下,我无法说出原因。请注意,对于每个请求,request.on('end', ...)都会被调用。
Farid Nouri Neshat

这可能与您的代码无关,我正在处理服务器发送的事件,并且可能已经搞砸了……您的代码工作正常,谢谢:)
Yan King Yin

与不使用“ end”处理程序(即不缓冲块)处理GET请求相比,这对性能有何影响?
JSON

1
这是对该问题的最佳答案。🧐–
蒙特利尔,

103

这是一个非常简单的无框架包装器,它基于此处发布的其他答案和文章:

var http = require('http');
var querystring = require('querystring');

function processPost(request, response, callback) {
    var queryData = "";
    if(typeof callback !== 'function') return null;

    if(request.method == 'POST') {
        request.on('data', function(data) {
            queryData += data;
            if(queryData.length > 1e6) {
                queryData = "";
                response.writeHead(413, {'Content-Type': 'text/plain'}).end();
                request.connection.destroy();
            }
        });

        request.on('end', function() {
            request.post = querystring.parse(queryData);
            callback();
        });

    } else {
        response.writeHead(405, {'Content-Type': 'text/plain'});
        response.end();
    }
}

用法示例:

http.createServer(function(request, response) {
    if(request.method == 'POST') {
        processPost(request, response, function() {
            console.log(request.post);
            // Use request.post here

            response.writeHead(200, "OK", {'Content-Type': 'text/plain'});
            response.end();
        });
    } else {
        response.writeHead(200, "OK", {'Content-Type': 'text/plain'});
        response.end();
    }

}).listen(8000);

不应将此检查转移到单独的中间件,以便它可以检查所有发布/发出请求中是否有太大的请求
Pavel Nikolov

@PavelNikolov这主要是指快速而又肮脏的工作,否则使用Express可能会更好,就像这里建议的可接受的答案一样(它可能还要处理大型请求)。可以根据自己的喜好随意修改和“分叉”它。
Mahn

那.read()方法呢?http模块不支持该功能吗?例如。response.read()
英国电信

嘿,只是好奇-为什么将有效负载放置到响应对象(response.post)中而不是请求对象中?
约瑟姆

@Jotham很好的问题...我不知道为什么我没有早点注意到这一点,但是没有理由应该这样做,response.post而不是更合乎逻辑request.post。我更新了帖子。
Mahn 2014年

83

如果将数据编码为JSON,然后将其发送到Node.js ,它将更加干净。

function (req, res) {
    if (req.method == 'POST') {
        var jsonString = '';

        req.on('data', function (data) {
            jsonString += data;
        });

        req.on('end', function () {
            console.log(JSON.parse(jsonString));
        });
    }
}

1
这对我有用。原来,其他解决方案返回的字符串看起来像JSON,但未解析。代替qs.parse()JSON.parse()将身体变成可用的东西。示例:var post = JSON.parse(body);,然后使用访问数据post.fieldname。(故事的寓意,如果您对所看到的内容感到困惑,请不要忘记typeof!)
wmassingham 2015年

12
好吧,请注意,您必须尝试捕获JSON.parse函数,因为如果我想使您的应用程序崩溃,只需发送带有原始文本的正文即可。
ecarrizo

您应该使用它request.setEncoding来使其正常工作,否则它可能无法正确处理非ASCII字符。
Farid Nouri Neshat

37

对于想知道如何在不安装Web框架的情况下完成这项琐碎任务的人,我设法将其组合在一起。尚未做好生产准备,但似乎可以正常工作。

function handler(req, res) {
    var POST = {};
    if (req.method == 'POST') {
        req.on('data', function(data) {
            data = data.toString();
            data = data.split('&');
            for (var i = 0; i < data.length; i++) {
                var _data = data[i].split("=");
                POST[_data[0]] = _data[1];
            }
            console.log(POST);
        })
    }
}

最后,针对此怪异问题的FULL WORKING解决方案..前面的答案也对理解为何在回调启动时请求内没有任何数据很有帮助。非常感谢!
luis-br

3
1)此答案假设数据是字符串。在一般情况下,错误的假设。2)此答案假设数据以一个块到达。否则,用'='分割将产生不可预测的结果。在一般情况下,错误的假设。
康斯坦丁

@Konstantin实际上,此答案假设数据是缓冲区。看一下这个。stackoverflow.com/questions/14551194/… 也是这个。millermedeiros.github.io/mdoc/examples/node_api/doc/…–
肖恩·

16

您可以使用body-parserNode.js主体解析中间件。

第一次加载 body-parser

$ npm install body-parser --save

一些示例代码

var express = require('express')
var bodyParser = require('body-parser')

var app = express()

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())


app.use(function (req, res) {
  var post_data = req.body;
  console.log(post_data);
})

更多文档可以在这里找到



9

如果您使用node-formidable,可以按照以下方法进行操作:

var formidable = require("formidable");

var form = new formidable.IncomingForm();
form.parse(request, function (err, fields) {
    console.log(fields.parameter1);
    console.log(fields.parameter2);
    // ...
});

我在尝试使用路径或路径+名称通过lwip.open访问文件时遇到路径问题(路径或路径+名称我收到的错误消息是未获取的图像
。– Lion789

7

如果您更喜欢使用纯Node.js,则可以提取POST数据,如下所示:

// Dependencies
const StringDecoder = require('string_decoder').StringDecoder;
const http = require('http');

// Instantiate the HTTP server.
const httpServer = http.createServer((request, response) => {
  // Get the payload, if any.
  const decoder = new StringDecoder('utf-8');
  let payload = '';

  request.on('data', (data) => {
    payload += decoder.write(data);
  });

  request.on('end', () => {
    payload += decoder.end();

    // Parse payload to object.
    payload = JSON.parse(payload);

    // Do smoething with the payload....
  });
};

// Start the HTTP server.
const port = 3000;
httpServer.listen(port, () => {
  console.log(`The server is listening on port ${port}`);
});


6

1)'body-parser'从npm 安装。

2)然后在您的app.ts中

var bodyParser = require('body-parser');

3)那你需要写

app.use(bodyParser.json())

app.ts模块中

4)请记住,您包括

app.use(bodyParser.json())

在顶部或任何模块声明之前。

例如:

app.use(bodyParser.json())
app.use('/user',user);

5)然后使用

var postdata = req.body;

5

如果您不想将数据与data回调一起分块,则可以始终使用如下readable回调:

// Read Body when Available
request.on("readable", function(){
  request.body = '';
  while (null !== (request.body += request.read())){}
});

// Do something with it
request.on("end", function(){
  request.body //-> POST Parameters as String
});

这种方法修改了传入的请求,但是一旦您完成响应,该请求就会被垃圾回收,因此这不会成为问题。

如果您担心庞大的身体,一种高级方法是首先检查身体大小。


方便的方法,但是如何以一种无法被恶意请求欺骗的方式“先检查身体大小”?
doug65536

request是正常的node.js流,因此您可以检查request.headers的正文长度,并在必要时中止请求。
Thomas Fankhauser 2013年

1
@ThomasFankhauser标头中的正文长度可能不是正确的值,甚至可能不正确。正确的方法是,当车身到达并缓冲它时,请检查尺寸以确保其不超过限制。
Farid Nouri Neshat

4

有多种方法可以做到这一点。但是,我知道最快的方法是将Express.js库与body-parser一起使用。

var express = require("express");
var bodyParser = require("body-parser");
var app = express();

app.use(bodyParser.urlencoded({extended : true}));

app.post("/pathpostdataissentto", function(request, response) {
  console.log(request.body);
  //Or
  console.log(request.body.fieldName);
});

app.listen(8080);

这可以用于字符串,但是如果POST数据包含JSON数组,则可以将bodyParser.urlencoded更改为bodyParser.json。

更多信息:http : //www.kompulsa.com/how-to-accept-and-parse-post-requests-in-node-js/


4

您需要POST使用以下数据块接收数据request.on('data', function(chunk) {...})

const http = require('http');

http.createServer((req, res) => {
    if (req.method == 'POST') {
        whole = ''
        req.on('data', (chunk) => {
            # consider adding size limit here
            whole += chunk.toString()
        })

        req.on('end', () => {
            console.log(whole)
            res.writeHead(200, 'OK', {'Content-Type': 'text/html'})
            res.end('Data received.')
        })
    }
}).listen(8080)

您应该考虑按照建议的在指定位置添加大小限制。


这是否更容易受到慢loris攻击?

与php相比,Nodejs较不易受lolo-loris的困扰-因为它没有在每个http连接周围建立一个大型会话对象。但是,此代码似乎仍可能会引入慢懒猴漏洞。setTimeout如果在该时间段内未收到完整请求,则可以通过在一定时间后结束连接来防止这种情况。
Gershom


3

如果使用Express.js,则必须先添加中间件bodyParser,然后才能访问req.body:

app.use(express.bodyParser());

那你可以要求

req.body.user

大多数中间件(如bodyParser)不再与Express捆绑在一起,必须单独安装。有关更多最新答案,请参见上面的@ nikodean2答案
Jeff Collier

app.use(bodyParser()); 可以,但是
却给


1

我找到了一段视频,解释了如何实现此目的:https : //www.youtube.com/watch?v=nuw48-u3Yrg

它使用默认的“ http”模块以及“ querystring”和“ stringbuilder”模块。该应用程序从网页上获取两个数字(使用两个文本框),并在提交后返回这两个数的总和(以及将值持久保存在文本框中)。这是我在其他任何地方都能找到的最佳示例。

相关源代码:

var http = require("http");
var qs = require("querystring");
var StringBuilder = require("stringbuilder");

var port = 9000;

function getCalcHtml(req, resp, data) {
    var sb = new StringBuilder({ newline: "\r\n" });
    sb.appendLine("<html>");
    sb.appendLine(" <body>");
    sb.appendLine("     <form method='post'>");
    sb.appendLine("         <table>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td>Enter First No: </td>");

    if (data && data.txtFirstNo) {
        sb.appendLine("                 <td><input type='text' id='txtFirstNo' name='txtFirstNo' value='{0}'/></td>", data.txtFirstNo);
    }
    else {
        sb.appendLine("                 <td><input type='text' id='txtFirstNo' name='txtFirstNo' /></td>");
    }

    sb.appendLine("             </tr>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td>Enter Second No: </td>");

    if (data && data.txtSecondNo) {
        sb.appendLine("                 <td><input type='text' id='txtSecondNo' name='txtSecondNo' value='{0}'/></td>", data.txtSecondNo);
    }
    else {
        sb.appendLine("                 <td><input type='text' id='txtSecondNo' name='txtSecondNo' /></td>");
    }

    sb.appendLine("             </tr>");
    sb.appendLine("             <tr>");
    sb.appendLine("                 <td><input type='submit' value='Calculate' /></td>");
    sb.appendLine("             </tr>");

    if (data && data.txtFirstNo && data.txtSecondNo) {
        var sum = parseInt(data.txtFirstNo) + parseInt(data.txtSecondNo);
        sb.appendLine("             <tr>");
        sb.appendLine("                 <td>Sum: {0}</td>", sum);
        sb.appendLine("             </tr>");
    }

    sb.appendLine("         </table>");
    sb.appendLine("     </form>")
    sb.appendLine(" </body>");
    sb.appendLine("</html>");
    sb.build(function (err, result) {
        resp.write(result);
        resp.end();
    });
}

function getCalcForm(req, resp, data) {
    resp.writeHead(200, { "Content-Type": "text/html" });
    getCalcHtml(req, resp, data);
}

function getHome(req, resp) {
    resp.writeHead(200, { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>Home</title></head><body>Want to some calculation? Click <a href='/calc'>here</a></body></html>");
    resp.end();
}

function get404(req, resp) {
    resp.writeHead(404, "Resource Not Found", { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>404</title></head><body>404: Resource not found. Go to <a href='/'>Home</a></body></html>");
    resp.end();
}

function get405(req, resp) {
    resp.writeHead(405, "Method not supported", { "Content-Type": "text/html" });
    resp.write("<html><html><head><title>405</title></head><body>405: Method not supported</body></html>");
    resp.end();
}

http.createServer(function (req, resp) {
    switch (req.method) {
        case "GET":
            if (req.url === "/") {
                getHome(req, resp);
            }
            else if (req.url === "/calc") {
                getCalcForm(req, resp);
            }
            else {
                get404(req, resp);
            }
            break;
        case "POST":
            if (req.url === "/calc") {
                var reqBody = '';
                req.on('data', function (data) {
                    reqBody += data;
                    if (reqBody.length > 1e7) { //10MB
                        resp.writeHead(413, 'Request Entity Too Large', { 'Content-Type': 'text/html' });
                        resp.end('<!doctype html><html><head><title>413</title></head><body>413: Request Entity Too Large</body></html>');
                    }
                });
                req.on('end', function () {
                    var formData = qs.parse(reqBody);
                    getCalcForm(req, resp, formData);
                });
            }
            else {
                get404(req, resp);
            }
            break;
        default:
            get405(req, resp);
            break;
    }
}).listen(port);

1

对于那些使用原始二进制POST上传而没有编码开销的用户,可以使用:

客户:

var xhr = new XMLHttpRequest();
xhr.open("POST", "/api/upload", true);
var blob = new Uint8Array([65,72,79,74]); // or e.g. recorder.getBlob()
xhr.send(blob);

服务器:

var express = require('express');
var router = express.Router();
var fs = require('fs');

router.use (function(req, res, next) {
  var data='';
  req.setEncoding('binary');
  req.on('data', function(chunk) {
    data += chunk;
  });

  req.on('end', function() {
    req.body = data;
    next();
  });
});

router.post('/api/upload', function(req, res, next) {
  fs.writeFile("binaryFile.png", req.body, 'binary', function(err) {
    res.send("Binary POST successful!");
  });
});

1

您可以使用快速中间件,该中间件现在内置了主体解析器。这意味着您需要做的是以下几点:

import express from 'express'

const app = express()

app.use(express.json())

app.post('/thing', (req, res) => {
  console.log(req.body) // <-- this will access the body of the post
  res.sendStatus(200)
})

该代码示例是带有Express 4.16.x的ES6。


0

您可以不使用express提取post参数。

1: nmp install multiparty

2:导入多方。如var multiparty = require('multiparty');

3:

if(req.method ==='POST'){
   var form = new multiparty.Form();
   form.parse(req, function(err, fields, files) {
      console.log(fields['userfile1'][0]);
    });
    }

4:和HTML FORM IS。

<form method=POST enctype=multipart/form-data>
<input type=text name=userfile1><br>
<input type=submit>
</form>

希望这对您有用。谢谢。


0

限制POST大小,避免淹没您的节点应用程序。有一个很棒的原始模块,适用于快速连接和连接,可以帮助您通过大小和长度来限制请求。


0

如果涉及文件上传,则浏览器通常将其作为"multipart/form-data"内容类型发送。您可以在这种情况下使用

var multipart = require('multipart');
multipart.parse(req)

参考1

参考2


0

在此类表单字段上

   <input type="text" name="user[name]" value="MyName">
   <input type="text" name="user[email]" value="myemail@somewherefarfar.com">

上述某些答案将失败,因为它们仅支持平面数据。

现在,我使用Casey Chu答案,但使用“ qs”而不是“ querystring”模块。这也是“ body-parser”使用的模块。因此,如果要嵌套数据,则必须安装qs。

npm install qs --save

然后像这样替换第一行:

//var qs = require('querystring');
var qs = require('qs'); 

function (request, response) {
    if (request.method == 'POST') {
        var body = '';

        request.on('data', function (data) {
            body += data;

            // Too much POST data, kill the connection!
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6)
                request.connection.destroy();
        });

        request.on('end', function () {
            var post = qs.parse(body);
            console.log(post.user.name); // should work
            // use post['blah'], etc.
        });
    }
}

0

您可以使用“请求-简化的HTTP客户端”和Javascript Promise轻松发送并获取POST请求的响应。

var request = require('request');

function getData() {
    var options = {
        url: 'https://example.com',
        headers: {
            'Content-Type': 'application/json'
        }
    };

    return new Promise(function (resolve, reject) {
        var responseData;
        var req = request.post(options, (err, res, body) => {
            if (err) {
                console.log(err);
                reject(err);
            } else {
                console.log("Responce Data", JSON.parse(body));
                responseData = body;
                resolve(responseData);
            }
        });
    });
}

0

如果希望表单数据在req.body中可用,则需要使用bodyParser()。body-parser解析您的请求并将其转换为一种格式,您可以从中轻松提取您可能需要的相关信息。

例如,假设您在前端有一个注册表单。您正在填充它,并请求服务器将详细信息保存在某处。

如果使用body-parser,从请求中提取用户名和密码将变得很简单。

……………………………………………………。

var loginDetails = {

username : request.body.username,

password : request.body.password

};

0

不带中间件 的一个衬套
如果您发布以下数据,
'name':'ABC'
则可以使用以下一个衬套进行解析,

require('url').parse(req.url, true).query.name
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.