Node.js 原生 `http` 模塊中,`request` 對象的 `headers` 屬性包含所有請求頭,鍵名**統一小寫**。
const http = require('http');
const server = http.createServer((req, res) => {
// 直接訪問 headers 對象(鍵名小寫)
const userAgent = req.headers['user-agent'];
console.log('User-Agent:', userAgent);
// 輸出示例: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...
// 解析客戶端信息
const clientInfo = parseUserAgent(userAgent);
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify({
userAgent,
clientInfo,
timestamp: new Date().toISOString()
}));
});
server.listen(3000, () => {
console.log('Server running on port 3000');
});
手寫正則解析極其複雜且難維護,強烈建議使用成熟庫:
const UAParser = require('ua-parser-js');
function parseUserAgent(uaString) {
const parser = new UAParser(uaString);
return {
browser: parser.getBrowser(), // {name: 'Chrome', version: '120.0.0', major: '120'}
engine: parser.getEngine(), // {name: 'Blink', version: '120.0.0'}
os: parser.getOS(), // {name: 'Windows', version: '10'}
device: parser.getDevice(), // {type: 'desktop', vendor: undefined, model: undefined}
cpu: parser.getCPU() // {architecture: 'amd64'}
};
}
const useragent = require('useragent');
function parseUserAgent(uaString) {
const agent = useragent.parse(uaString);
return {
family: agent.family, // 'Chrome'
major: agent.major, // '120'
minor: agent.minor, // '0'
patch: agent.patch, // '0'
os: agent.os.toString(), // 'Windows 10'
device: agent.device.toString() // 'Desktop'
};
}
const express = require('express');
const app = express();
app.get('/api/client-info', (req, res) => {
// Express 同樣通過 req.headers
const ua = req.headers['user-agent'];
// 或 req.get('User-Agent') 不區分大小寫
const info = parseUserAgent(ua);
res.json({ userAgent: ua, ...info });
});
app.listen(3000);
req.headers = {
'host': 'localhost:3000',
'user-agent': 'Mozilla/5.0...',
'accept': 'text/html,application/xhtml+xml,...',
'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
'accept-encoding': 'gzip, deflate, br',
'connection': 'keep-alive',
'upgrade-insecure-requests': '1',
'cookie': 'sessionId=abc123; preference=dark',
'referer': 'https://google.com/',
'x-forwarded-for': '192.168.1.100' // 代理/負載均衡傳遞真實 IP
}
function getClientIP(req) {
return req.headers['x-forwarded-for'] ||
req.headers['x-real-ip'] ||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
(req.connection.socket ? req.connection.socket.remoteAddress : null);
}
⚠️ User-Agent **可偽造**,不可作為身份驗證或權限控制依據。僅用於統計、適配、風控輔助判斷。
核心代碼就一行:req.headers['user-agent'],配合 `ua-parser-js` 即可獲得結構化客戶端信息。