LoginSignup
hositasi1019
@hositasi1019 (koseki akira)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Node.jsに送信されたPOSTの値の部分だけ抽出したい

現在はHTMLからNode.jsに値を送った場合、「title=XXX&body=XXX」の状態で取得出来るのですが
そのXXXの部分だけ抽出したいですが
それって可能でしょうか

start.html
<html>
    <header>
        <meta charset="utf-8"/>
    </header>
    <body>
        <form method="post">
            <input type="text" name="title"/>
            <input type="text" name="body"/>
            <button type="submit">Submit</button>
        </form>
    </body>
</html>
start.js
var http = require('http');
var fs = require('fs');
var html = fs.readFileSync("start.html");
var server = http.createServer(function(req, res) {
    if (req.method == "GET") {
        res.end(html);
    } else {
        var data = '';
        //POSTデータを受けとる
        req.on('data', function(chunk) {data += chunk})
            .on('end', function() {
            res.end(html + decodeURI(data));
            // textに入れた値が、"title=XXX&body=XXX"という形式で表示される
            // そのXXXの部分だけ抽出したい
            // decodeURI(data).requestGetParameter("title");みたいな
        })
    }
}).listen();
1

2Answer

もちろん querystring でも良いのですが Node.js でしか使えません。
url に含まれる URLSearchParams はブラウザの api と挙動が同じなので学習の手間が省けます。

const http = require('http')
const fs = require('fs')
const { URLSearchParams } = require('url')

const html = fs.readFileSync('start.html')
const server = http
  .createServer(async (req, res) => {
    res.setHeader('content-type', 'text/html')
    if ('GET' === req.method) return res.end(html)
    let data = ''
    for await (const chunk of req) data += chunk
    const params = new URLSearchParams(data)
    const title = params.get('title')
    console.log(title)
    res.end(html + `<pre>${require('util').inspect(params)}</pre>`)
  })
  .listen()
1

Your answer might help someone💌