Node-RED中如何在oneditprepare函数中使用basic-ftp包?
问题根源
Node-RED的节点编辑界面(oneditprepare运行的环境)是浏览器前端环境,不支持Node.js的require()语法,所以直接在oneditprepare里引入basic-ftp会报错。修改settings.js是给后端节点运行环境添加依赖,对前端编辑界面完全无效。
解决方案
正确的思路是通过后端节点代码获取FTP文件列表,再通过HTTP接口传递给前端编辑界面,分三步实现:
1. 后端节点代码实现FTP文件获取接口
在节点的.js文件(后端运行环境)中,添加一个接收前端请求的HTTP接口:
module.exports = function(RED) { function CustomFtpNode(config) { RED.nodes.createNode(this, config); const node = this; // 处理前端编辑界面的文件列表请求 RED.httpAdmin.get('/ftp-node/get-files', async function(req, res) { const ftp = require("basic-ftp"); const client = new ftp.Client(); client.ftp.verbose = true; try { // 建议从节点配置读取FTP参数,而非硬编码 await client.access({ host: config.ftpHost || "192.168.104.105", user: config.ftpUser || "testuser", password: config.ftpPwd || "1234", }); const ftpList = await client.list("/files"); const fileNames = ftpList.map(item => item.name); client.close(); res.json({ success: true, files: fileNames }); } catch (err) { node.error("FTP连接失败:" + err.message); res.json({ success: false, error: err.message }); } }); } RED.nodes.registerType("custom-ftp-node", CustomFtpNode); }
2. 前端oneditprepare调用后端接口
修改节点.html文件中的oneditprepare函数,通过HTTP请求获取文件列表并填充到select标签:
oneditprepare: async function () { try { const response = await fetch('/ftp-node/get-files'); const result = await response.json(); if (result.success) { const fileNames = result.files; console.log("FTP文件列表:", fileNames); // 填充到select标签(假设select的id为node-input-ftpFile) const selectEl = $('#node-input-ftpFile'); selectEl.empty(); fileNames.forEach(file => { selectEl.append($('<option></option>').val(file).text(file)); }); } else { alert("获取FTP文件失败:" + result.error); } } catch (err) { console.error("请求接口出错:", err); alert("获取文件列表失败,请检查后端日志"); } }
3. 补充配置与依赖
- 将
basic-ftp添加到节点的package.json依赖中,或者在Node-RED的settings.js里通过functionGlobalContext配置(推荐前者,保证节点依赖独立); - 重启Node-RED使后端代码生效;
- 建议在前端编辑界面添加FTP服务器地址、账号、密码的输入框,避免硬编码敏感信息,后端从
config对象读取对应参数。
内容的提问来源于stack exchange,提问作者Syed Abdul Hannan
相关产品推荐
相关产品推荐

