在 Node.js 服务器完成启动后,以 kiosk 模式打开 localhost:3000

Open localhost:3000 in kiosk mode after the Node.js server has finished spinning up

我正在从事一个 raspberry pi 项目,该项目涉及 运行 在 kiosk 模式下安装节点服务器。

我正在使用 BROWSER=none 禁止在服务器 运行 时默认打开本地主机。

我想我应该能够使用 wait-on 来强制 bash 脚本 运行 的信息亭模式等到服务器完全启动。我会用这样的东西吗?

"scripts": {
    ...
    "kiosk": "concurrently -n \"npm start\" \"wait-on http://localhost:3000 & /home/pi/kiosk.sh\""
  },

它给了我以下我不太能破译的错误:

[npm start] server does not have extension for -dpms option
[npm start] libEGL warning: DRI2: failed to authenticate
[npm start] [1498:1498:1125/180040.467781:ERROR:gpu_init.cc(441)] Passthrough is not supported, GL is egl
[npm start] [1498:1498:1125/180040.786918:ERROR:viz_main_impl.cc(162)] Exiting GPU process due to errors during initialization
[npm start] [1558:1558:1125/180041.392714:ERROR:gpu_init.cc(441)] Passthrough is not supported, GL is swiftshader
[npm start] [1443:1590:1125/180042.359030:ERROR:object_proxy.cc(622)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[npm start] [1443:1590:1125/180042.364570:ERROR:object_proxy.cc(622)] Failed to call method: org.freedesktop.UPower.GetDisplayDevice: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[npm start] [1443:1590:1125/180042.367155:ERROR:object_proxy.cc(622)] Failed to call method: org.freedesktop.UPower.EnumerateDevices: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
[npm start] Fontconfig error: Cannot load default config file: No such file: (null)

我现在意识到我的代码中的错误与 kiosk.sh 有关,而不是与 npm 命令有关。这是 kiosk.sh:

的代码
#!/bin/bash

xset s noblank
xset s off
xset -dpms

unclutter -root &

sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' /home/pi/.config/chromium/Default/Preferences
sed -i 's/"exit_type":"Crashed"/"exit_type":"Normal"/' /home/pi/.config/chromium/Default/Preferences

/usr/bin/chromium-browser --noerrdialogs --disable-infobars --kiosk http://localhost:3000/ &

我假设您正在使用“wait-on”包 (https://www.npmjs.com/package/wait-on)。 wait-on命令前面没有npm使用

尝试使用

wait-on http://localhost:3000 && /home/pi/kiosk.sh

一旦服务器准备就绪,您可以使用“child_process”npm 包来执行您的 bash 脚本。假设您在后端使用 Express.js,只需稍加修改就可以使用

const exec = require('child_process');
//all your other codes and whatevers
app.listen(3000, () => {
    var kiosk = exec('sh kiosk.sh',
        (error, stdout, stderr) => {
            if (error) {
                console.log(`exec error: ${error}`);
            }
     });
});

&&&表示不同的东西,&&表示AND,&表示后台进程,运行后台服务并继续下一个。

我认为你想做的是 wait-on service && example,而不是 wait-on service & example

你所做的会发生什么是它将 运行 等待,然后立即后台处理它,然后立即 运行 shell 脚本而不等待任何事物。在服务器启动之前,您的脚本将 运行。

虽然那不是你的问题,我相信你的问题是铬本身。这里有一个未解决的问题:https://bugs.chromium.org/p/chromium/issues/detail?id=1221905&q=Passthrough%20is%20not%20supported%2C%20GL%20is%20swiftshader&can=1。该问题最后一次更新是在今年早些时候,但似乎仍未解决。

这里还有另一个答案:

我看到很多人建议您使用 --headless--disable-gpu 以及 --disable-software-rasterizer。人们提到其中一些选项仅在 windows 上是必需的,有些已经修复,我不知道其中哪些是实际需要的。

此处回答:Force headless chromium/chrome to use actual gpu instead of Google SwiftShader,提到您可以使用 --enable-webgl 强制 webgl 以防止它加载 swiftshader 并使用 gpu。如果你需要在无头模式下强制它,你可以这样做。

好像跟webgl或者硬件加速有关系。显然,如果您禁用了 gpu 加速,然后它被迫回退到 swiftloader,就会发生这种情况。

我不知道其中哪一个能真正帮助到您,您将不得不尝试一下。但是,由于铬中的这个错误,我看到了 2021 年期间出现的 10 多个不同的铬和其他相关问题。

更重要的是,我不确定它实际上是一个严重错误,有人提到它只是显示错误但可以忽略。不知道是不是这样

wait-on 等到进程关闭。你没有关闭铬,所以它永远不会继续。如果你想等到服务器 运行ning。您可以将服务器的状态记录到一个文本文件中,然后让您的 bash 脚本循环读取它,直到它包含您指定的就绪文本。

如果您想毫无疑问地确认服务器运行正在按需运行。

您可以安装 npm 包 puppetter。然后使用 运行 使用 page.goto 命令从 bash 创建和 运行 节点脚本以在 Chromium 实例中加载网页并使用 waitForSelector 检查是否 DOM 您的网页的元素存在。

然后你使用调用 process.exit() 和任何你想使用的错误代码来确认页面是活的并且 运行ning.