0

0

Node-RED UI模板中标签内动态数据处理指南

花韻仙語

花韻仙語

发布时间:2025-11-20 21:38:02

|

217人浏览过

|

来源于php中文网

原创

node-red ui模板中<script>标签内动态数据处理指南">标签内动态数据处理指南" /></p>
<p>在Node-RED UI模板的`<script>`标签中,直接使用Mustache语法注入复杂代码块或对象通常无法按预期工作,且存在安全隐患。本教程将详细阐述UI模板的渲染机制,指导如何通过AngularJS的`$scope`对象安全有效地访问`msg`数据,实现脚本内部变量的动态赋值,并探讨子流在管理复杂UI组件中的作用,以构建健壮、可维护的动态UI。</script></p>
<h3>理解Node-RED UI模板的渲染机制</h3>
<p>Node-RED的UI模板节点(ui-template)结合了Mustache模板引擎和AngularJS框架来渲染用户界面。理解其工作原理是正确处理动态数据的关键:</p>
<ol>
<li>
<strong>Mustache模板渲染:</strong> 当Node-RED收到一条消息并将其传递给UI模板节点时,Mustache模板引擎会首先处理模板中的{{...}}表达式。这个过程发生在服务器端(或在<a style=浏览器端加载时),它主要用于将msg对象的属性值插入到HTML内容或JavaScript变量的定义中。

  • 浏览器端JavaScript执行: <script>标签内的JavaScript代码在浏览器加载并解析HTML后执行。这是一个独立的客户端执行环境,它与Mustache模板引擎的处理是两个不同的阶段。
  • 这意味着,Mustache引擎会将{{...}}替换为字符串,然后浏览器再尝试执行替换后的JavaScript代码。

    为何直接注入代码块不可行(或不推荐)

    用户尝试使用{{msg.payload.ranges1}}来替换多行JavaScript变量赋值:

    } else if ($scope.msg.topic === "temperature_avg") {
        // 期望此处能动态生成 high = 88; mid = 65; low = 60; size= "0.9em";
        {{msg.payload.ranges1}} 
    }

    这种做法通常无法按预期工作,原因如下:

    • 对象到字符串的转换: 如果msg.payload.ranges1是一个JavaScript对象(例如{high: 88, mid: 65, low: 60, size: "0.9em"}),Mustache引擎在将其插入到JavaScript代码中时,会将其转换为字符串[object Object]。这在JavaScript中不是有效的变量赋值语句,会导致运行时错误。
    • 代码注入风险: 即使msg.payload.ranges1包含一个有效的JavaScript代码字符串(例如"high = 88; mid = 65; low = 60; size= '0.9em';"),直接通过Mustache注入并执行也极不推荐。这构成了一个严重的安全漏洞(跨站脚本攻击 XSS),因为恶意用户可以通过发送特制的消息来执行任意JavaScript代码。此外,这种方式也难以维护和调试。
    • 非动态更新: Mustache渲染通常在模板加载时进行一次。如果希望脚本内的变量能响应Node-RED流中后续消息的更新,直接的Mustache注入无法实现这种动态行为。

    推荐方案:通过$scope对象访问msg数据

    Node-RED UI模板基于AngularJS,提供了一个$scope对象,它是AngularJS控制器和视图之间的数据绑定桥梁。通过$scope.msg,你可以在JavaScript代码中安全、动态地访问传入的Node-RED消息对象。为了响应消息的更新,我们使用$scope.$watch来监听$scope.msg的变化。

    以下是实现动态变量赋值的推荐方法:

    吐槽大师
    吐槽大师

    吐槽大师(Roast Master) - 终极 AI 吐槽生成器,适用于 Instagram,Facebook,Twitter,Threads 和 Linkedin

    下载
    1. 监听$scope.msg的变化: 使用$scope.$watch('msg', function() { ... })来确保每次有新消息到达时,脚本内的逻辑都能被重新执行。
    2. 安全访问msg属性: 在$scope.$watch回调函数中,通过$scope.msg.payload.ranges1安全地访问数据。
    3. 提取并使用变量: 从ranges1对象中提取所需的high, mid, low, size等变量,并提供默认值以增加健壮性。

    示例代码:

    假设你的Node-RED流发送的消息结构如下:

    msg.topic = "temperature_avg";
    msg.payload = {
        ranges1: {
            high: 95,
            mid: 70,
            low: 55,
            size: "1.2em"
        }
    };
    return msg;

    UI模板节点中的JavaScript部分应这样编写:

    <script>
    (function($scope) {
        // 使用 $scope.$watch 监听 $scope.msg 的变化
        // 确保每次新消息到来时都能更新数据
        $scope.$watch('msg', function() {
            // 检查 msg 对象是否存在且 topic 匹配
            if ($scope.msg && $scope.msg.topic === "temperature_avg") {
                // 确保 payload 和 ranges1 属性存在
                if ($scope.msg.payload && $scope.msg.payload.ranges1) {
                    // 从 msg.payload.ranges1 中安全地获取变量
                    let ranges = $scope.msg.payload.ranges1;
                    let high = ranges.high || 88; // 提供默认值,防止属性缺失
                    let mid = ranges.mid || 65;
                    let low = ranges.low || 60;
                    let size = ranges.size || "0.9em"; // 确保字符串类型,并提供默认值
    
                    // 在这里使用 high, mid, low, size 变量执行你的逻辑
                    console.log("动态温度范围设置:", { high, mid, low, size });
    
                    // 示例:更新UI元素或执行其他计算
                    // 如果你的UI元素绑定到 $scope 上的变量,可以这样更新:
                    // $scope.currentHigh = high;
                    // $scope.currentMid = mid;
                    // $scope.currentLow = low;
                    // $scope.currentSize = size;
    
                } else {
                    console.warn("msg.payload.ranges1 不存在或为空,使用默认值。");
                    // 可以在此处设置默认值,或者使用之前定义的默认值
                    let high = 88;
                    let mid = 65;
                    let low = 60;
                    let size = "0.9em";
                    console.log("使用默认温度范围设置:", { high, mid, low, size });
                }
            }
        });
    })(scope);
    </script>

    Node-RED流程示例 (用于测试上述UI模板):

    1. 拖入一个 inject 节点。
    2. 拖入一个 function 节点,并连接到 inject 节点。
    3. 拖入一个 ui_template 节点(选择“Template”类型),并连接到 function 节点。
    4. 拖入一个 debug 节点(连接到 ui_template 节点,可选)。

    function 节点代码:

    // 模拟发送带有动态数据的消息
    msg.topic = "temperature_avg";
    msg.payload = {
        ranges1: {
            high: Math.floor(Math.random() * (100 - 80 + 1)) + 80, // 80-100
            mid: Math.floor(Math.random() * (75 - 55 + 1)) + 55,  // 55-75
            low: Math.floor(Math.random() * (60 - 40 + 1)) + 40,  

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    WorkBuddy
    WorkBuddy

    腾讯云推出的AI原生桌面智能体工作台

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    js 字符串转数组
    js 字符串转数组

    js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

    761

    2023.08.03

    js截取字符串的方法
    js截取字符串的方法

    js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

    221

    2023.09.04

    java基础知识汇总
    java基础知识汇总

    java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

    1568

    2023.10.24

    字符串介绍
    字符串介绍

    字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

    651

    2023.11.24

    java读取文件转成字符串的方法
    java读取文件转成字符串的方法

    Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

    1228

    2024.03.22

    php中定义字符串的方式
    php中定义字符串的方式

    php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

    1204

    2024.04.29

    go语言字符串相关教程
    go语言字符串相关教程

    本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

    193

    2025.07.29

    c++字符串相关教程
    c++字符串相关教程

    本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

    131

    2025.08.07

    TypeScript类型系统进阶与大型前端项目实践
    TypeScript类型系统进阶与大型前端项目实践

    本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

    26

    2026.03.13

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    React 教程
    React 教程

    共58课时 | 6万人学习

    TypeScript 教程
    TypeScript 教程

    共19课时 | 3.4万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 3.6万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号