如何在node.js中获取有关客户端的信息

12

在这个非常简单的例子中:

var sys = require("sys"),
    http = require("http");

http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("Hello World!");
}).listen(8080);

sys.puts("Server running at http://localhost:8080/");

1.) 我可以从客户端获取哪些信息?比如浏览器、屏幕分辨率等?

2.) 我如何将信息从客户端发送到服务器,比如参数?

谢谢!

3个回答

23

1) Referrer URL,IP地址,用户代理,屏幕尺寸和其他统计数据。您也可以获取地理位置,但这更加复杂。

2) 一些数据可在头部获得,因此这些数据会随每个请求发送 - 其他数据(例如屏幕尺寸)则有点棘手,因此您需要进行ajax请求以将其发送。

// Somewhere on your page(s) - here we use jQuery
$(document).ready(function(){   
  // Check if they have been logged
  if ($.cookie('logged') == null ){
    // Send screen size and whatever else that is not available from headers
    $.post('/logger', { width: screen.width, height: screen.height }, function(res) {
      // Set cookie  for 30 days so we don't keep doing this
       $.cookie('logged', true, { expires: 30 }); 
    });
  } 
 });  

// Server side - example is an Express controller
exports.logger = function(req, res) {
  var user = {
    agent: req.header('user-agent'(, // User Agent we get from headers
    referrer: req.header('referrer'), //  Likewise for referrer
    ip: req.header('x-forwarded-for') || req.connection.remoteAddress, // Get IP - allow for proxy
    screen: { // Get screen info that we passed in url post data
      width: req.param('width'),
      height: req.param('height')
    }
  };
  // Store the user in your database
  // User.create(user)...
  res.end();
}

对于“referrer”,浏览器会使用单个R发送“referer”(参考来源)。Express不会将其翻译为正确的拼写,因此上述内容需要使用req.headers['referer'] - Arjan
@Arjan 它们是可以互换的。Express 可以处理任意一个。https://github.com/expressjs/express/blob/master/lib/request.js#L76 - cyberwombat
很奇怪,因为在发布评论之前我进行了测试(甚至在我的代码中添加了一条注释说明Express不会翻译...)。明天再重新检查一下,但你的链接是正确的。 :-) - Arjan
啊,你在评论中提到了(好用的)辅助函数 header('referrer') (它是 req.get('referrer') 的别名,确实处理了 refererreferrer 两种情况)。然而,在你的回答中,你直接访问了请求属性 headers,即 req.headers['referrer'],这会返回 undefined。;-) - Arjan
太好了!谢谢你发现了这个问题。我已经更新了答案,使用了辅助函数。 - cyberwombat

11

您无法获取屏幕分辨率信息,但是您可以从请求头“User-Agent”中获取用户代理。


这需要什么代码?我已经尝试了req.getHeader('User-Agent'),但不认为它有效。 - zzaman
13
尝试使用req.headers['user-agent'],因为在Node中,所有的头信息都是小写字母 - phreakhead

6
你是否阅读过API文档?req对象是一个HTTP.ServerRequest对象,如文档所述。它是HTTP协议,分辨率等内容不属于协议的一部分。你可以获得用户代理,并从那里使用另一个服务检索更多信息。
请记住,node.js是一个独立的应用程序 - 它不在浏览器中运行 - 它是在JS解释器中运行的HTTP服务器应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接