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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 14:50:30