请问 Nodejs 中 google 的 puppeteer 模块 和 node.js 自带 的 http、https 模块 有冲突,怎么解决?

发布于 1周前 作者 gougou168 来自 nodejs/Nestjs

请问 Nodejs 中 google 的 puppeteer 模块 和 node.js 自带 的 http、https 模块 有冲突,怎么解决?
测试代码段如下:

async function puppeteer_promise ( ) {
…var puppeteer = require(‘puppeteer’); /*** 屏蔽测试 /
…return ;
}

async function http_promise ( ) {
…var http = require(‘http’);
…var https= require(‘https’);

…var url = new URL ( “https://www.baidu.com/” ) ;
…var http = ( url.protocol == ‘https:’ ? https : http ) ; // 重新赋值 http ,判断是 http 还是 https ;
…console.log( “url.protocol:” + url.protocol ) ;

…http.get ( url , function ( res ) { /
屏蔽测试 /

…}).on(‘error’, function (err) {
…console.log(err);
…});

…return ;
}

async function test_alldata ( ) {

…console.log( “开始测试!” ) ;

…await puppeteer_promise();
…console.log( “puppeteer 结束!” ) ;

…await http_promise();

…console.log( “结束测试!” ) ;

…return ; // 隐式返回 Promise.resolve( ); 函数 ;

}

test_alldata();

报错信息如下:
(node:6212) UnhandledPromiseRejectionWarning: TypeError: Cannot read property ‘startsWith’ of undefined
at urlToOptions (internal/url.js:1259:28)
at Object.request ( https.js:279:15)
at Object.request (C:\Users\Claire\Desktop\spider\node_modules\agent-base\patch-core.js:25:22)
at Object.https.get (C:\Users\Claire\Desktop\spider\node_modules\agent-base\patch-core.js:48:21)
at http_promise (C:\Users\Claire\Desktop\spider\test.js:17:7)
at test_alldata (C:\Users\Claire\Desktop\spider\test.js:34:9)
at process._tickCallback (internal/process/next_tick.js:68:7)
at Function.Module.runMain (internal/modules/cjs/loader.js:832:11)
at startup (internal/bootstrap/node.js:283:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)
(node:6212) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:6212) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Node 10.16
WIN10_x64 系统

屏蔽 var puppeteer = require(‘puppeteer’);
或者 屏蔽
…http.get ( url , function ( res ) { /
屏蔽测试 ***/

…}).on(‘error’, function (err) {
…console.log(err);
…});
运行就不会报错。

请问各位,知道是怎么回事吗?
有没有什么解决办法啊?


7 回复

有趣,node v10.15.3 也有这个问题,v12.6.0 没有这个问题。

另外发帖用 md 就行,不用手动排版,等下班再看下是为啥。


谢谢,我是从 15.3 升级到 16 的。

你用 12.6.0 会有这个问题吗?

没有试,晚上试看看

是 agent base 改变了 http 的行为导致的 …后来 node 修复了

谢谢解答啊

在Node.js中,Google的Puppeteer模块与Node.js自带的http、https模块通常不会有直接的冲突。它们各自服务于不同的功能:Puppeteer用于自动化Chrome或Chromium浏览器操作,而http、https模块则用于处理HTTP请求和响应。

如果遇到看似由冲突引起的问题,可能是由以下原因导致的:

  1. 代码错误:在代码中可能不小心重写了某些变量或未正确处理异步操作。
  2. 版本不兼容:Node.js或Puppeteer的版本与其他依赖项不兼容。

以下是一个简单的示例,展示如何在同一个Node.js项目中同时使用Puppeteer和https模块:

const puppeteer = require('puppeteer');
const https = require('https');

(async () => {
  // 使用Puppeteer
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await browser.close();

  // 使用https模块
  https.get('https://example.com', (res) => {
    console.log('statusCode:', res.statusCode);
    res.on('data', (d) => {
      process.stdout.write(d);
    });
  }).on('error', (e) => {
    console.error(e);
  });
})();

确保你的Node.js和Puppeteer版本是最新的,或者至少是彼此兼容的。如果问题依旧存在,建议检查具体的错误信息并逐一排查。

回到顶部