【问题标题】:Node JS cli script crashing when packaged to a executable with pkg使用 pkg 打包到可执行文件时,Node JS cli 脚本崩溃
【发布时间】:2021-07-24 14:13:17
【问题描述】:

一个非常简单的网络自动化脚本,用于使用 puppeteer 填写表单,当我使用 node filename.js

运行它时,它可以在我的 IDE 中完美运行

但是当我使用pkg 将它打包成可执行文件时,它在第一个输入实例时崩溃而没有抛出任何错误,我不希望直接解决这个问题,但也许有人有类似的经历并且可以告诉我可能是什么原因造成的,因为我现在不知道该怎么做。

代码:

    const puppeteer = require('./node_modules/puppeteer')

const parse = require('csv-parse');
const fs = require('fs');
const readline = require("readline");
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

const data = [];

menu()

async function menu() {
    console.log("Please select a option\n\n" +
    "1. The Streets raffle\n" +
    "2. Footshop raffle\n" +
    "3. Exit");
    rl.question("", async function(answer) {
        console.log(`user choice: ${answer}`);

        if(answer === "1") {
            console.log("streets module starting");
            await streets_module();
        }
        else if(answer === "2") {
            console.log("In development, press enter to exit");
            rl.question("", async function(answer) {
            });
            rl.close;
            process.exit(0);
        }
        else if(answer === "3"){
            console.log("Now exitting...");
            rl.close;
            process.exit(0);
        }
        else {
            console.log("undefined choice, exitting...");
            rl.close;
            process.exit(0);
        }
        
    });
}

async function streets_module() {
    fs.createReadStream("profiles.csv") // this part can be omitted and instead the array from below can be assigned to the data variable
    .pipe(parse({ delimiter: ',' }))
    .on('data', (r) => {
        //console.log("r: ", r);
        data.push(r);        
    })
    .on('end', async () => {
        //console.log("data: ",data);
        //console.log("data at 1: ", data[1][0]); // prvy profil

        console.log("data length: ", data.length, data);

        for (let ii = 1; ii < data.length; ii++) {
            //console.log("this triggered");
            //C:\chrome-win\chrome.exe
            //console.log("async block triggered");
            console.log(`profile ${ii} started`)
            const browser = await puppeteer.launch({ignoreDefaultArgs: ['--disable-extensions']});
            const page = await browser.newPage();
            await page.goto('https://www.thestreets.sk/online-raffle/');
            await page.type("#name", data[ii][0]); // ,{ delay: 100 });
            await page.type("#yourEmail", data[ii][1]);//, { delay: 100 });
            await page.type("#phone", data[ii][2]);//, { delay: 100 });
            await page.type("#street", data[ii][3]);//, { delay: 100 });
            await page.type("#city", data[ii][4]);//, { delay: 100 });
            await page.type("#psc", data[ii][5]);//, { delay: 100 });
            await page.select('select#state', data[ii][6]);//, { delay: 100 }); 
            await page.select('select#prefered_size_sel', data[ii][7]);//, { delay: 100 });
            await page.$eval('input[name="agreed_personal_info_tiny_contact_form"]', check => check.checked = true);
        
        
            await page.screenshot({ path: 'streets' + ii + '.png' });
        
            await page.click('input[name="submit"]');
            
            //console.log("async block finished");
            console.log(`profile ${ii} finished`);
            await browser.close();
        }
        console.log("all profiles traversed, closing...");
        process.exit(0);
    })
    
}

csv 文件包含一些测试数据,以查看表单是否填写正确,这是用于测试目的的数组中的数据:

    [
  [
    'Full name',
    'Email',
    'Phone number',
    'Street',
    'City',
    'Postal code',
    'State',
    'Size'
  ],
  [
    'test',
    'test@test.com',
    '090123456789',
    'ulica',
    'Presov',
    '10902',
    'SVK',
    '5W'
  ],
  [
    'test 2',
    'test2@test.com',
    '090123452789',
    'ulica2',
    'Presov2',
    '10903',
    'SVK',
    '6W'
  ]
]

该问题的视频: a video showcase of the issue

感谢您走到这一步,并就 exe 文件崩溃的原因提出任何可能的建议 :)

【问题讨论】:

  • 这就是你的全部代码吗?因为如果是这样,您的程序不会崩溃,而只是退出,因为您没有调用您定义的任何函数。你只需要定义一堆consts 和async functions 但不要对它们做任何事情。这让我想知道如果您通过 node filename.js 调用它会如何工作
  • no haha​​ :D 有 rl readline 库充当用户的输入收集器,所以rl.question("", async function(answer) 将等到用户输入他们的选择,如果是选择 1 并且我启动脚本在我的 IDE 中,它遍历配置文件并制作它们的屏幕截图。但是在可执行文件中,它会立即关闭而不制作任何屏幕截图,与在我的 IDE 中运行脚本相比,我也没有收到使用 .exe 填写表单的电子邮件确认
  • 我将通过嵌入视频来编辑问题,使其更有意义
  • 嗯,是的,rl 原则上会收集输入。但是如果没有调用menu(),菜单将如何显示以及何时调用rl.question( ...)?答案是从不因此程序存在...
  • 从 PS 运行 exe,这样你就可以看到它的内容了。

标签: javascript node.js puppeteer exe executable


【解决方案1】:

尝试将 csv 文件名替换为其绝对路径,以防被访问的目录不同

【讨论】:

  • 谢谢,这是一个愚蠢的错误,但它奏效了。 @pguardiario 的评论也让调试 exe 文件变得更容易了,感谢大家
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
  • 2018-03-25
  • 1970-01-01
相关资源
最近更新 更多