Node.js에서 POST 데이터를 처리하는 방법?


637

Node.jsform[method="post"] 의 HTTP POST메소드에서 전송 된 양식 데이터 ( ) 및 파일 업로드를 어떻게 추출 합니까?

나는 googled 문서를 읽었으며 아무것도 찾지 못했습니다.

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

도서관이나 해킹이 있습니까?

답변:


552

당신이 사용하는 경우 익스프레스 (Node.js를위한 고성능, 높은 수준의 웹 개발), 당신은이 작업을 수행 할 수 있습니다 :

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
하위 레벨 진입 점을 사용하려는 경우 실제로 기능은 연결시 BodyParser 모듈에 있습니다.
Julian Birch

14
혼란 스러워요. name = "user [email]"은 request.body.email과 어떻게 일치합니까?
sbose

36
하느님!! 가진 화가 무엇입니까는 동일한 프레임 워크 동시에 3 doumentations을 읽기 / nodejs.org/api/http.html , senchalabs.org/connect & expressjs.com/guide.html
살만 폰 압바스

15
내가 추가 할 때까지 이것은 작동하지 않았습니다 app.use(express.bodyParser());.
pettys

13
Express는 jQuery가 무엇인지 클라이언트 측 JS에 연결하는 것입니다. 내가 노드에 대한 Google 도움말을 볼 때마다 나는이 절름발이 "use express!" 대답. 전체 웹 프레임 워크 설치를 정당화 할 수 있도록 게시물 데이터를 구문 분석하는 것이 정말로 어렵습니까?
Shawn Whinnery

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.
        });
    }
}

예를 들어, inputname 필드 가 있다면 age변수를 사용하여 액세스 할 수 있습니다 post.

console.log(post.age);

8
@ thejh 흠, 좋은 지적입니다. 그러나 그것을 추가하는 것은 어렵지 않아야하므로 일을 단순하게 유지하기 위해 예제에서 제외하겠습니다.
Casey Chu

72
node.js 웹 서버 개발에는 몇 분 동안 코딩을 절약하기 위해 몇 시간 동안 연구해야하는 미들웨어가 있습니다. 거의 모든 문서가 제공하는 scant 문서는 물론입니다. 그리고 응용 프로그램은 당신의 것이 아닌 다른 사람들의 기준에 의존합니다. 또한 여러 가지 성능 문제가 있습니다.
Juan Lanus

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(); 실행되는 콜백을 방지하지 않습니다! 예를 들어 "종료"콜백은 잘린 몸체로 실행됩니다! 이것은 아마도 당신이 원하는 것이 아닐 것입니다.
collimarco

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

1
@SSH : 아니요, 1 * 10 ^ 6 = 1000000입니다.
thejh

@tq :이 경우 POST [이름] (예 : POST [ "foo"]).
thejh

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를 아약스 의 기본 콘텐츠 형식으로 호출 한 다음 콘텐츠 형식입니다 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 인 경우 qs.parse 대신 JSON.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 요청 본문을 사용하는 방법에 대해 위에서 설명했지만이 모듈 중 하나를 사용하면 가장자리를 더 잘 처리 할 수 ​​있으므로 직접 구현하는 것이 좋습니다. Express의 경우 body-parser를 사용하는 것이 좋습니다 . koa의 경우 비슷한 모듈이 있습니다.

프레임 워크를 사용하지 않으면 이 좋습니다.


감사합니다. 코드를 사용하여 신비한 중복 메시지를 받았습니다. 변수 request를 재사용하고 request.on('end')여러 번 호출 했을 수 있습니까? 어떻게 피할 수 있습니까?
Yan King Yin

코드를 보지 않으면 이유를 알 수 없습니다. 모든 요청에 request.on('end', ...)대해 호출됩니다.
Farid Nouri Neshat 1

그것은 아마도 코드와 관련이 없으며 서버가 보낸 이벤트를하고 있고 그것을 망 쳤을 수도 있습니다 ... 어쨌든 코드는 정상적으로 작동합니다 :)
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 ()
BT

이봐, 궁금해-페이로드를 요청 객체가 아닌 응답 객체 (response.post)에 넣은 이유는 무엇입니까?
Jotham

@Jotham good question ... 왜 내가 이전에 알아 채지 못했는지는 모르겠지만 response.post더 논리적이지 않은 이유는 없습니다 request.post. 게시물을 업데이트했습니다.
Mahn

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
교훈

12
응용 프로그램을 충돌 시키려면 본문을 원시 텍스트로 보내야하기 때문에 JSON.parse 함수를 잡아야한다는 것을 알아야합니다.
ecarrizo

당신은 사용해야하는 request.setEncoding이 작업이 제대로 다른 사람이 제대로 비 ASCII 문자를 처리 할 수 있도록.
Farid Nouri Neshat

37

웹 프레임 워크를 설치하지 않고이 사소한 작업을 수행하는 방법을 궁금해하는 사람은 이것을 함께 관리했습니다. 생산 준비가 거의되지 않았지만 작동하는 것 같습니다.

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);
        })
    }
}

마지막 으로이 이상한 문제에 대한 전체 작업 솔루션 .. 또한 이전 답변은 콜백이 시작될 때 요청에 데이터가없는 이유를 이해하는 데 많은 도움이되었습니다. 많은 감사합니다!
luis-br

3
1)이 답변은 데이터가 문자열이라고 가정합니다. 일반적인 경우에는 잘못된 가정입니다. 2)이 답변은 데이터가 한 청크로 도착한다고 가정합니다. 그렇지 않으면 '='로 나누면 예기치 않은 결과가 발생합니다. 일반적인 경우에는 잘못된 가정입니다.
Konstantin

@Konstantin 실제로이 답변은 데이터가 버퍼라고 가정합니다. 이것 좀 봐. stackoverflow.com/questions/14551194/… 또한 이것. millermedeiros.github.io/mdoc/examples/node_api/doc/…
Shawn Whinnery

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

1
@ThomasFankhauser 헤더의 본문 길이가 올바른 값이 아니거나 존재하지 않을 수도 있습니다. 그것을하는 올바른 방법은 몸이 도착하고 그것을 버퍼링 할 때 크기를 확인하여 한계를 초과하지 않는지 확인하십시오.
Farid Nouri Neshat

4

여러 가지 방법이 있습니다. 그러나 내가 아는 가장 빠른 방법은 body.parser와 함께 Express.js 라이브러리를 사용하는 것입니다.

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)

jh가 제안한 대로 표시된 위치에 크기 제한을 추가하는 것을 고려해야 합니다.


이것이 느린 로리 스 공격에 더 취약합니까?

Nodejs는 모든 HTTP 연결을 중심으로 큰 세션 객체를 작성하지 않기 때문에 php보다 느린 로리에 덜 취약합니다. 그러나이 코드는 여전히 느리게 진행되는 취약점을 일으킬 수 있습니다. setTimeout해당 기간 내에 전체 요청이 수신되지 않으면 일정 시간이 지나면 연결이 종료되는 경우이를 방지 할 수 있습니다 .
Gershom


3

Express.js 를 사용 하는 경우 req.body에 액세스하기 전에 미들웨어 bodyParser를 추가해야합니다.

app.use(express.bodyParser());

그럼 당신은 요청할 수 있습니다

req.body.user

bodyParser와 같은 대부분의 미들웨어는 더 이상 Express와 번들로 제공되지 않으며 별도로 설치해야합니다. 에 대한 최신 대답 @ nikodean2 위의 답변을 참조하십시오
제프 콜리에게

app.use (bodyParser ()); 작동하지만 내가 빨간색 오류 메시지를 중단주고있다
크리스 Allinson

2

Express와 같은 전체 프레임 워크를 사용하고 싶지 않지만 업로드를 포함하여 다른 종류의 양식이 필요한 경우 포르말린 이 좋은 선택 일 수 있습니다.

Node.js 모듈에 나열되어 있습니다


1

이를 달성하는 방법을 설명하는 비디오를 찾았습니다 : https://www.youtube.com/watch?v=nuw48-u3Yrg

"querystring"및 "stringbuilder"모듈과 함께 기본 "http"모듈을 사용합니다. 응용 프로그램은 웹 페이지에서 두 개의 텍스트 상자를 사용하여 두 개의 숫자를 가져 와서 제출하면 두 개의 합계를 반환합니다 (텍스트 상자의 값을 유지함). 이것은 다른 곳에서 찾을 수있는 가장 좋은 예입니다.

관련 소스 코드 :

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

body-parser가 내장 된 express 미들웨어를 사용할 수 있습니다 . 이것은 당신이해야 할 모든 것은 다음과 같습니다 :

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 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 답변을 사용하고 있지만 "querystring"모듈 대신 "qs"를 사용하고 있습니다. 이것은 "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

"Request-Simplified HTTP client"및 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

MIDDLEWARE
없는 하나의 라이너 다음 데이터를 게시
'name':'ABC'
하면 다음 하나의 라이너를 사용하여 데이터 를 구문 분석 할 수 있습니다.

require('url').parse(req.url, true).query.name
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.