我来自 NightmareJS 的 http 响应代码未定义

My http response code from NightmareJS is undefined

您好,欢迎来到 2017 年:)

我正在尝试用 NightmareJS 代替 PhantomJS,到目前为止效果很好(PhantomJS 对我来说执行得非常慢,因此进行了更改)

我的问题是当我尝试 return http 响应 header 时,值未定义。

我查看了文档和许多示例,它们都指向与我的非常相似的代码。

我正在通过将 show 设置为 true 来检查我正在打开的 site/s,所以我知道它们确实打开了

感谢任何帮助,干杯。

我当前的代码如下:

var Nightmare = require('nightmare');

var nightmare = Nightmare({
    show: false,
    switches: {
        'ignore-certificate-errors': true
    },
    webPreferences:{
        images: true
    },
    //waitTimeout: 1000,
    loadTimeout: 30000 //** If we cant reach the page after nnnn millseconds, timeout
});

//** Start nightmare
var ms = Date.now(); //** Set a timer
nightmare
.cookies.clearAll()
.goto(url)
.screenshot('abc123.png')
.end()
.then(function(httpResponse){
    console.log(httpResponse.code); //** <<<< Here SHOULD be the http response code
    console.log(Date.now() - ms);
    callback(siteObject); //
})
.catch(function (error) {
    console.error('Search failed:', error);
});

出现问题是因为线路

.screenshot('abc123.png')

如果您删除它,那么 httpResponse.code 将 return 一个状态代码。

我认为这可能是一个错误 - 我已经与开发人员公开了 an issue,我会回复您。

更新

我刚刚收到来自 rosshinkley 的回复,他是 nightmarejs 的最大贡献者:

httpResponse is not defined because the parameters passed to .then() will be from the last action executed in the chain (with the exception of .end()) - in your case, .screenshot() (which doesn't return anything). If you need the HTTP response, you can break up your chain with another .then() to perform logic.

原始问题可以用(再次归功于rosshinkley)解决:

nightmare.goto(url)
.then(function(httpResponse) {
  if(httpResponse.code == 200) {
    return nightmare.screenshot('abc123.png');
  } 
  else {
    //error condition?
    throw new Error('http response was not ok');
  }
})
.then(function(){ return nightmare.end(); })