Node.js 传递的函数不能很好地序列化
我正在使用Puppeter从包含订单数据的文件模板中刮取web 为此,我使用了一个puppeter求值函数,当文件位于.js中时,该函数可以正常工作 但是,当使用“pkg”包编译.exe文件或计算以执行并启动返回或错误时:“传递的函数不完全可序列化!” 代码如下: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')
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()允许任何通过的参数也进行计算。谢谢。非常感谢。我正要错过明天的截止日期:)