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

部署在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:24:01