如何在NodeJs中处理多个并行请求

时间:2016-03-08 11:06:28

标签: node.js phantomjs

我使用PhantomJS在NodeJS中截取屏幕截图,但它无法处理来自用户的多个请求。问题是当多个用户同时发送请求时,他们会得到相同的结果。

这是我使用的代码:

var http = require('http');
var phantom = require('phantom');
var url, img;
http.createServer(function(req, res) {
  res.setHeader('Content-Type', 'text/html; charset=utf-8');
  res.writeHeader(200, { "Content-Type": "text/html" });
  url = req.url;
  url = url.replace('/', '');
  url = url.trim();
  if (!(url == 'favicon.ico')) {
    console.log(url);
    phantom.create().then(function(ph) {
      ph.createPage().then(function(page) {
        page.property('viewportSize', { width: 1024, height: 768 }).then(function() {
          page.open('http://' + url + '/').then(function(status) {
            console.log(status);
            page.property('onLoadFinished').then(function() {
              if (!(status == 'success')) {
                res.write('<html><body><h2>' + status + ' : ' + url + ' is not correct url!</h2></body></html>');
                res.end();
                page.close();
              } else {
                setTimeout(function() {
                  page.renderBase64('jpeg').then(function(img) {
                    res.write('<html><body><img src="data:image/jpeg;base64,' + img + '"/></body></html>');
                    res.end();
                    page.close();
                  });
                }, 4000);
              }
            });
          });
        });
      });
    });
  }
}).listen(80, '127.0.0.1');
console.log('Server running at http://127.0.0.1:80/');

1 个答案:

答案 0 :(得分:3)

您已在var url, img;请求范围之外定义http,这意味着他们会被不同的请求共享(一个请求可能会更改它,而前一个请求仍在处理它),这可能是造成这个问题的原因。在请求处理程序中移动这些声明:

// var url, img; // << move this
http.createServer(function(req, res) {
  var url, img; // << here
  res.setHeader('Content-Type', 'text/html; charset=utf-8');
  res.writeHeader(200, { "Content-Type": "text/html" });