npm问题需要

时间:2017-09-12 02:10:03

标签: node.js npm node-modules package.json nightmare

我正在运行一个Nightmare.js脚本,其中我正在尝试require lodash (在本地安装了npm,在node_modules中,在package.json中注册)。

index.js:

var Nightmare = require('nightmare');
var _ = require('lodash');

function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min;
}

function getElms(elm) {
    var elsm =  document.querySelectorAll(elm);
    return _.map(elsm, function(elem){ return elem.innerHTML; });
} 

var someWebsite = new Nightmare({ show: false })
  .goto( ***some url*** )
  .wait(getRandomInt(2500, 5000))
  .evaluate(function () {

      var elsm =  document.querySelectorAll(***some selector***);
      return _.map(elsm, function(elem){ return elem.innerHTML; });

      // return getElms(***some selector***);


  }).then(function(linkstexts) {
    console.log(linkstexts)
  });
  • 但我得到了这个:

    UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝ID:1):_未定义

    • 类似问题,如果我取消注释并使用return getElms(***some selector***);

这是package.json

{
  "name": "nightxp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "lodash": "^4.17.4",
    "nightmare": "^2.10.0"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

enter image description here

我错过了什么?

更新

我尝试将lodash传递到浏览器范围,并使用catch()完成, 但不知何故,lodash变量仍然没有传递给范围(例如hackernews):

var Nightmare = require('nightmare');
var lodash = require('lodash');

function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min; 
}

var facebook = new Nightmare({ show: false })
  .goto('https://news.ycombinator.com')
  .wait(getRandomInt(5500, 6000))
  .evaluate(  (lodash) => {
      var elsm =  document.querySelectorAll('tr td.title a.storylink');
      return lodash.map(elsm, function(elem){ return elem.innerHTML; });
   }, lodash).then(function(titles) {
    console.log(titles)
  }).catch(function (error) {
      console.error('Error:', error);
  });

这就是我得到的:

C:\Projects\nightmare>set DEBUG=nightmare & node index.js
  nightmare queuing process start +0ms
  nightmare queueing action "goto" for https://news.ycombinator.com +4ms
  nightmare queueing action "wait" +2ms
  nightmare queueing action "evaluate" +0ms
  nightmare running +1ms
Error: Cannot read property 'map' of undefined

1 个答案:

答案 0 :(得分:1)

运行时

var someWebsite = new Nightmare({ show: false })
.evaluate(function () {
/* ... */
}

您现在处于浏览器范围内 - 您可以将Nightmare.evaluate视为在独立浏览器的上下文中运行包含的代码,这意味着您的全局范围(包括_)不可用。

请点击此处获取更多信息以及有关将数据传递到范围的一些提示:

https://github.com/segmentio/nightmare/issues/89

https://github.com/segmentio/nightmare/issues/333

编辑:

虽然可以从节点上下文将简单值传递给evaluate,但是不能使用函数和方法传递复杂值。这是因为参数在传输过程中是序列化的,这对于函数来说很困难。这是一个解释它的问题:

https://github.com/segmentio/nightmare/issues/349

在这种特殊情况下,似乎最简单的事情就是在没有lodash的情况下工作,这些日子并不难。例如:

var facebook = new Nightmare({ show: false })
.goto('https://news.ycombinator.com')
.wait(getRandomInt(5500, 6000))
.evaluate(  () => {
    var elsm =  document.querySelectorAll('tr td.title a.storylink');
    return Array.prototype.map.call(elsm, elem => elem.innerHTML)
})
.then(function(titles) {
    console.log("title", titles)
})
.catch(function (error) {
    console.error('Error:', error);
});