You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Raspberry Pi B+的服务端HTTPS触发门铃执行失败求助

排查步骤及解决方案

1. 优先检查HTTPS配置问题

你的前端请求用了https://10.8.8.109:3000,但默认Express启动的是HTTP服务,没有SSL证书的话,浏览器会直接拒绝连接,触发catch块的错误。

解决方法:给Express配置HTTPS,用自签名证书(树莓派上生成):

  • 生成证书:
    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
    
  • 修改Node代码,替换app.listen部分:
    const https = require('https');
    const fs = require('fs');
    
    const options = {
      key: fs.readFileSync('./key.pem'),
      cert: fs.readFileSync('./cert.pem')
    };
    
    https.createServer(options, app).listen(port, () => {
      console.log(`HTTPS Server running on port ${port}`);
    });
    

2. 查看服务端具体错误日志

前端报错只是表层问题,必须看服务端控制台输出的exec error和stderr信息,这能直接定位命令执行失败的原因。

临时修改代码,把错误详情返回给前端,方便排查:

app.post('/play-sound', (req, res) => {
  exec('/usr/bin/aplay /usr/share/sounds/alsa/doorbell.wav', (error, stdout, stderr) => {
    if (error) {
      const errorDetails = `exec error: ${error.message}\nstderr: ${stderr}`;
      console.error(errorDetails);
      return res.status(500).send(errorDetails); // 返回错误详情
    }
    console.log(`stdout: ${stdout}`);
    console.error(`stderr: ${stderr}`);
    res.send('Sound played successfully');
  });
});

然后在前端catch块里添加console.log(await error.response?.text()),就能看到具体错误内容。

3. 检查Node进程的音频权限

树莓派上,运行Node的用户(比如默认的pi)可能没有访问音频设备的权限,导致aplay无法执行。

执行以下命令添加权限:

sudo usermod -aG audio pi

重新登录终端后重启Node服务即可生效。

4. 解决跨域问题

如果你的HTML页面是在非树莓派设备上打开的,浏览器会触发跨域限制,导致请求失败。

安装并启用CORS中间件:

  • 安装:
    npm install cors
    
  • 在Node代码中添加:
    const cors = require('cors');
    app.use(cors()); // 放在bodyParser之前
    

5. 确保命令使用绝对路径

exec的环境变量可能和终端不同,建议用aplay的绝对路径/usr/bin/aplay,避免出现找不到命令的问题(即使你在终端测试过aplay可用,进程环境仍可能存在差异)。

内容的提问来源于stack exchange,提问作者wah0808

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:25:21