使用 NodeJS + Express 從 GET/POST Request 取值

過去無論哪一種網站應用程式的開發語言,初學者教學中第一次會提到的起手式,八九不離十就是 GET/POST Request 的取值。但是,在 Node.js + Express 的世界中,彷彿人人是高手,天生就會使用,從不曾看到有人撰文說明。

這應該算是開發 Web Service 的入門,在 Client 與 Server 的互動中,瀏覽器發出 GET/POST Request 時會傳值給 Server-side,常見應用就是網頁上以 POST method 送出的表單內容,或是網址列上的 Query Strings (ex: page?page=3&id=5)。然後,我們的網站應用程式透過解析這些參數,得到使用者上傳的資訊。

取得 GET Request 的 Query Strings:
GET /test?name=fred&tel=0926xxx572
app.get('/test', function(req, res) {
    console.log(req.query.name);
    console.log(req.query.tel);
});

如果是透過表單且是用 POST method:
<form action='/test' method='post'>
<input type='text' name='name' value='fred'>
<input type='text' name='tel' value='0926xxx572'>
<input type='submit' value='Submit'>
</form>
app.post('/test', function(req, res) {
    console.log(req.body.name);
    console.log(req.body.tel);
});

當然也可以 Query Strings 和 POST method 的表單同時使用:
<form action='/test?id=3' method='post'>
<input type='text' name='name' value='fred'>
<input type='text' name='tel' value='0926xxx572'>
<input type='submit' value='Submit'>
</form>
app.post('/test', function(req, res) {
    console.log(req.query.id);
    console.log(req.body.name);
    console.log(req.body.tel);
});


順帶補充,還有另一種方法傳遞參數給 Server,就是使用路徑的方式,可以利用 Web Server 的 HTTP Routing 來解析,常見於的各種 Web Framework。這不算是傳統標準規範的做法,是屬於 HTTP Routing 的延伸應用。
GET /hello/fred/0926xxx572
app.get('/hello/:name/:tel', function(req, res) {
    console.log(req.params.name);
    console.log(req.params.tel);
});


後記

筆者最近收到網友 $10 USD 的贊助,這對持續在網路上經營寫作,是莫大的股舞,由衷感謝!

留言

  1. 對於Express, 在GET, POST做了一個很棒的示範,好文章!

    回覆刪除
  2. app.post('/', function(req, res){
    var name = req.param('name');

    這樣呢?

    回覆刪除
  3. 這也是可行的的方式,事實上有多種方式可以取得參數,挑一種方便使用的即可。

    回覆刪除
  4. 我們經常會用 JSON.stringify(data)的方式POST到後端,那這種方式該如何獲取?

    回覆刪除
  5. 不太能理解你的意思,你的意思是說將 data 轉成字串並塞到一個變數中,然後傳到後端嗎?

    其實 Node.js 本身就是 V8 JavaScript Engine,你仍然可以直接用 JSON.parse() 去處裡前端傳過來的資料。

    回覆刪除
  6. 試用了POST的實作,在win7上使用express3.2.6版本,似乎要在路由前加上

    app.configure(function(){
    app.use(express.bodyParser());
    });

    才可以順利執行req.body.name
    否則name會被判定為undefined

    回覆刪除

張貼留言

這個網誌中的熱門文章

有趣的邏輯問題:是誰在說謊

Web 技術中的 Session 是什麼?

淺談 USB 通訊架構之定義(一)

淺談 USB 通訊架構之定義(二)

Reverse SSH Tunnel 反向打洞實錄