http服務
我們知道,使用nodejs標準庫的http模塊創建一個http服務很簡單,如下:
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
http.createServer
傳了一個回調函數作爲參數,每當一個請求進來時,會產生一個request
事件,從而讓該回調函數被調用一次,該回調函數接收兩個參數,req表示請求對象,res表示響應對象,但是需要注意的是,req對象中包含了http請求的所有請求頭,但是卻不包含Post請求的數據(request body)。
獲取請求數據
那麼我們如何得到Post請求的數據呢?事實上,請求數據是以流的方式從客戶端(瀏覽器)傳到服務端的,當有數據到達時,req對象會產生一個data
事件,當數據傳輸完畢時,req對象會產生一個end
事件,因此,我們只需要將data
事件中得到的數據暫時保存起來,當end
事件產生時表示數據已經傳輸完,便可以開始使用得到的請求數據,代碼示例如下:
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
let data = []
req.on('data', chunk => {
data.push(chunk) // 將接收到的數據暫時保存起來
})
req.on('end', () => {
console.log(JSON.parse(data)) // 數據傳輸完,打印數據的內容
})
// res.statusCode = 200;
// res.setHeader('Content-Type', 'text/plain');
// res.end('Hello World');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
使用express
如果使用express的話,就非常方便了,可以使用body-parser
直接將body數據解析到req對象中:
const bodyParser = require('body-parser')
app.use(
bodyParser.urlencoded({
extended: true
})
)
app.use(bodyParser.json())
app.post('/todos', (req, res) => {
console.log(req.body) // 直接通過req對象中的body屬性就可以得到請求數據
})