讲师中心 微信公众号
AI工具推荐 视频效率加速

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

酷杰大大_7528

酷杰大大_7528

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

|

237人浏览过

|

来源于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模板引擎会首先处理模板中的{{...}}表达式。这个过程发生在服务器端(或在浏览器端加载时),它主要用于将msg对象的属性值插入到HTML内容或JavaScript变量的定义中。</li>
<li>
<strong>浏览器端JavaScript执行:</strong> <script>标签内的JavaScript代码在浏览器加载并解析HTML后执行。这是一个独立的客户端执行环境,它与Mustache模板引擎的处理是两个不同的阶段。</li>
</ol>
<p>这意味着,Mustache引擎会将{{...}}替换为字符串,然后浏览器再尝试执行替换后的JavaScript代码。</p>
<h3>为何直接注入代码块不可行(或不推荐)</h3>
<p>用户尝试使用{{msg.payload.ranges1}}来替换多行JavaScript变量赋值:</p><pre class=} 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的变化。

Feishu calendar sync, local ics to json data for AI agent
Feishu calendar sync, local ics to json data for AI agent

将ICS日历文件转为JSON格式,用于飞书日历导入导出及数据集成。

下载

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

  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工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

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

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

1618

2023.08.03

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

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

2424

2023.09.04

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

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

5904

2023.10.24

字符串介绍
字符串介绍

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

5189

2023.11.24

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

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

6914

2024.03.22

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

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

9594

2024.04.29

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

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

4879

2025.07.29

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

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

5167

2025.08.07

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.6万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn