【发布时间】:2014-04-12 17:10:05
【问题描述】:
我开始使用包“ua-parser”,但是创建者太忙了,无法维护或提交...... npm ua-parser 已过时,需要直接从 github 下载。有人知道其他好包,如 ua-parser 已更新并可与 expressjs 一起使用吗?或者有办法只用 expressjs 处理?
【问题讨论】:
标签: node.js express user-agent
我开始使用包“ua-parser”,但是创建者太忙了,无法维护或提交...... npm ua-parser 已过时,需要直接从 github 下载。有人知道其他好包,如 ua-parser 已更新并可与 expressjs 一起使用吗?或者有办法只用 expressjs 处理?
【问题讨论】:
标签: node.js express user-agent
你看过了吗:
或者,编写自己的中间件:
app.use(function(req, res, next) {
res.locals.ua = req.get('User-Agent');
next();
});
【讨论】:
一般有两种情况,只需要简单匹配,不需要模块,在Node中使用regex即可。
var isIpad = !!req.headers['user-agent'].match(/iPad/);
var isAndroid = !!req.headers['user-agent'].match(/Android/);
==> true, false
另一个,如果你需要一个干净的浏览器类型的输出,这对我来说效果最好。 https://www.npmjs.org/package/useragent
【讨论】:
我对 Express 的最佳解决方案...轻巧/快速! https://www.npmjs.com/package/express-useragent
app.use(require('express-useragent').express())
你的中间件...
app.use(function(req, res, next) {
req.session.useragent = {
browser: req.useragent.browser,
version: req.useragent.version,
os: req.useragent.os,
platform: req.useragent.platform
}
console.log(JSON.stringify(req.session.useragent, null ,4))
next()
}
【讨论】:
感谢decoder7283。点赞!
我在您的解决方案中又添加了一项信息:
const app = express();
const useragent = require('express-useragent');
app.use(useragent.express());
app.use(function(req, res, next) {
if (!req.session.useragent) {
let userAgentIs = (useragent) => {
let r = [];
for (let i in useragent)
if (useragent[i] === true)
r.push(i);
return r;
}
req.session.useragent = {
browser: req.useragent.browser,
version: req.useragent.version,
os: req.useragent.os,
platform: req.useragent.platform,
geoIp: req.useragent.geoIp, // needs support from nginx proxy
source: req.useragent.source,
is: userAgentIs(req.useragent),
};
}
return next();
});
req.session.useragent的输出
{
browser: 'Firefox',
version: '92.0',
os: 'Windows 10.0',
platform: 'Microsoft Windows',
geoIp: {},
source: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0',
is: [ 'isAuthoritative', 'isFirefox', 'isDesktop', 'isWindows' ]
}
【讨论】: