使用网桥获取PhantomJS返回的状态代码

时间:2014-12-15 12:52:41

标签: javascript node.js phantomjs

我正在创建一个小API来监控我的某些网站的性能。为此,我想要加载时间和http状态代码。我使用节点js和phatomjs来做到这一点,到目前为止我的加载时间恰到好处,但我似乎无法获得状态代码。我尝试了一些不同的东西,但到目前为止都没有。

这是我现在的代码:

var express = require('express');
var app = express();

app.get('/', function(req, res) {
        res.type('application/json');
        res.send('{"status": "running"}');
});

app.get('/site/:url', function(req, res){
        res.type('application/json');
        res.header('Access-Control-Allow-Origin', '*');
        res.header('Cache-Control', 'no-cache');
        var url = decodeURIComponent(req.param('url'));
        var phantom = require('phantom');
        var time, code;

        phantom.create(function(ph){
                ph.createPage(function(page){
                        time = Date.now();
                        page.open(url, function(status){
                                time = Date.now() - time;

                                res.send({"status": status, "time": time});
                        });
                });
        });
});

var server = app.listen(80, function() {
        var host = server.address().address;
        var port = server.address().port;

        console.log('Got\'cha .. ', host, port);
});

我已经尝试了http://phantomjs.org/api/webpage/handler/on-resource-received.html,但我似乎无法看到我可以调用它的位置,因此我可以将其与其他数据一起返回。到目前为止,我得到了类似{"status":"success","time":1723}的内容。

有人知道我能做些什么吗?

1 个答案:

答案 0 :(得分:2)

你是对的,onResourceReceived提供了实际的状态代码。如functionality details所示,您必须使用page.set设置事件处理程序。

您可以假设onResourceReceived在页面open回调之前执行:

var statusCode = null;
page.set('onResourceReceived', function(resource){
    statusCode = resource.status;
});
page.open(url, function(status){
    time = Date.now() - time;
    res.send({"status": statusCode, "time": time});
});

如果您无法确定(您应该进行一些测试),那么您可以使用waitFor from here之类的内容:

var statusCode = null;
page.set('onResourceReceived', function(resource){
    statusCode = resource.status;
});
page.open(url, function(status){
    waitFor(function(){
        return !!statusCode;
    }, function(){
        time = Date.now() - time;
        res.send({"status": statusCode, "time": time});
    });
});