部署在freebox的在线网站点击按钮执行Node.js脚本报require未定义如何解决
问题原因
你遇到的require is not defined报错本质是运行环境差异导致的:
require是Node.js 专属的CommonJS模块化语法,浏览器原生环境不支持该语法- 你使用的
ewelink-api包默认是为Node.js服务端环境开发的,不能直接在前端浏览器中运行 - 更重要的风险提示:绝对不要把ewelink的账号密码直接写在前端页面代码里,你的网站部署在公网,任何人都可以通过查看网页源代码拿到明文账号密码,直接控制你的设备,存在极高安全隐患。
可行的实现方案(适配公网部署要求)
你需要把设备控制逻辑放在服务端执行,前端仅通过接口触发操作,不会泄露任何敏感信息,也不需要用localhost部署:
- 第一步:在你的Freebox服务器上搭一个极简的Node.js后端服务,比如用Express框架实现:
// 服务端代码 server.js const express = require('express'); const ewelink = require('ewelink-api'); const app = express(); const port = 3000; // 可以自定义端口,后续配反向代理到你网站的/api路径下 // 允许跨域(如果前端和后端端口不同的话) app.use(require('cors')()); // 设备控制接口 app.post('/api/toggle-astrolabe', async (req, res) => { try { const connection = new ewelink({ email: 'XX', password: 'XX', region: 'eu' }); const status = await connection.setDevicePowerState('1001091c4b', 'toggle', 1); res.json({ success: true, data: status }); } catch (err) { res.status(500).json({ success: false, msg: err.message }); } }); app.listen(port, () => console.log('服务运行中'));
- 第二步:在Freebox的配置里,把你网站的
/api/*路径反向代理到刚才启动的Node.js服务端口,公网用户就可以通过你的网站域名直接访问接口,不需要用localhost。 - 第三步:修改你的前端页面代码,按钮点击时调用接口即可:
// 前端index.html里的脚本 document.querySelector('#你的按钮id').addEventListener('click', async () => { try { const res = await fetch('/api/toggle-astrolabe', { method: 'POST' }); const data = await res.json(); console.log('操作结果', data); } catch (err) { console.error('操作失败', err); } });
- 第四步:在Freebox服务器上安装依赖、启动后端服务并设置开机自启即可正常使用。
为什么命令行执行不会报错
命令行执行node index.js时用的是Node.js运行环境,原生支持require语法,也可以读取你本地安装的node_modules依赖包,所以可以正常运行,和前端浏览器是完全不同的运行环境,逻辑不能直接复用。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

