Node.js 传递的函数不能很好地序列化

Node.js 传递的函数不能很好地序列化,node.js,puppeteer,Node.js,Puppeteer,我正在使用Puppeter从包含订单数据的文件模板中刮取web 为此,我使用了一个puppeter求值函数,当文件位于.js中时,该函数可以正常工作 但是,当使用“pkg”包编译.exe文件或计算以执行并启动返回或错误时:“传递的函数不完全可序列化!” 代码如下: const dados = {name: 'foo', year: 1} await page.evaluate(dados => { let dom = document.querySelector('body')

我正在使用Puppeter从包含订单数据的文件模板中刮取web

为此,我使用了一个puppeter求值函数,当文件位于.js中时,该函数可以正常工作

但是,当使用“pkg”包编译.exe文件或计算以执行并启动返回或错误时:“传递的函数不完全可序列化!

代码如下:

const dados = {name: 'foo', year: 1}
  await page.evaluate(dados => {
    let dom = document.querySelector('body');
    const tags = Object.keys(dados);

    for (let i = 0; i < tags.length; i++) {
      const tag = tags[i];
      dom.innerHTML = dom.innerHTML.split(`{{${tag}}}`).join(dados[tag]);
    }
  }, dados);
const dados={name:'foo',年份:1}
等待页面。评估(护墙板=>{
让dom=document.querySelector('body');
const tags=Object.keys(护墙板);
for(设i=0;i
对我来说,最简单的解决方案是用eval()包装它:

异步getText(选择器:字符串){ 等待此.page.waitForSelector(选择器); 让text=wait eval(`this.page.$eval(`${selector}',el=>el.textContent)`) 返回文本; } 或者这个:

wait eval(`this.page.evaluate(
(选择器)=>{(document.querySelector(选择器).value='';},
选择器);`);

我有一个关于
木偶演员和
pkg
的确切问题。出于某种原因,pkg无法正确解释回调的内容。我的解决方案是将字符串传递给
evaluate
,而不是传递函数:

更改:

const dados={name:'foo',年份:1}
等待页面。评估(护墙板=>{
让dom=document.querySelector('body');
const tags=Object.keys(护墙板);
for(设i=0;i

wait page.evaluate(`
(() => {
const dados={name:'foo',年份:1};
让dom=document.querySelector('body');
const tags=Object.keys(护墙板);
for(设i=0;i
建议另一种解决方案-使用
pkg
api在编译时注入回调,但它对我不起作用。

我尝试使用
pkg
添加
--public
参数

比如:
pkg start.js-t node14-win-x64-public

然后我可以自由使用
ElementHandle.evaluate((elem)=>elem.textContent)

有了pkg的手册,
--public
意味着:加快并公开顶级项目的来源

顺便提一下 修复找不到chrome二进制文件

browser=wait puppeter.launch({
可执行路径:“node_modules/puppeter/.local chromium/win64-782078/chrome win/chrome.exe”
});
(上面的路径可以随意设置。)

修复start.exe无法运行

有时输出的二进制exe无法执行。信息技术 当我们输入
start.exe
时,总是弹出一个新的cmd提示符窗口。(或者双击。)

  • 只需删除输出exe,然后重新运行pkg
  • 检查代码是否可通过
    节点start.js运行

能否尝试删除字符串插值?(
{{${tag}}
)作为test@hardkoded不起作用:(您可以添加更多与错误相关的信息吗?堆栈跟踪?是的,这对我很有效。Eval()允许任何通过的参数也进行计算。谢谢。非常感谢。我正要错过明天的截止日期:)