开发基础
开发基础笔记
mybatis-plus通用的service方法
通过jenkins配置前后端自动打包及发布
mybatis-plus实现分页的方式
Java极客技术公众号PDF
狂神说SpringBoot
Hashids java 版使用
SpringBoot
1、Web快速开发
2、结果集的封装
3、集成MyBatis实现数据库操作
4、Springboot @Validated参数校验
5、SpringBoot全局异常处理
6、拦截器HandlerInterceptor
7、集成Swagger实现API自动生成
8、集成knife4j实现API自动生成
9、Springboot集成MyBatis-Plus快速入门
10、springboot自定义注解及AOP切面使用
11、使用Shiro实现登陆和权限认证,基于MyBatis
12、集成SpringSecurity实现授权认证
13、SpringBoot集成EasyExcel实现数据导入与导出
14、Spring Task定时任务的实现
15、Quartz快速上手与实践
16、如何用代码实现Spring IOC
17、SpringBoot集成JWT,实现接口的鉴权交互
SpringCloud
Nacos作为服务注册中心
seata1.6.1 结合springcloud实现分布锁的技术笔记
一些技术博客推荐
前端面试相关
看这一篇就够了
java.util包常用的类和接口
CountDownLatch介绍与使用
Common-lang3使用入门
Hutool简单使用入门
lombok 介绍及基本使用方法
git项目统计成员代码行数和提交的次数
mysql 逗号分隔的数据 like查询
使用sonar进行代码质量检查
线上使用jmeter进行压测的时候,使用Arthas诊断工具排查响应慢的接口
php结合phpstudy8、vscode开启xdebug进行代码调试
node-red使用入门
本文档使用 MrDoc 发布
-
+
首页
node-red使用入门
node-red是一个很强大的流程工具,IBM出品,系统插件有5000多个,在接入数据库 或一些物联网设备的时间 是一个非常不错的可视化数据抽取工具。 我这里假设有这样一个需求,使用node-red想实现一个小功能,从mysql数据库里取一张表,这个表里有一个url字段,存着几百个网址的url地址,用node-red的mysql组件把这些url取出来之后,请求这些url的http状态,如果是200的话,把这个网址的状态更新回数据库,如果http是500或404的话,把相应的状态码更新回数据库,这个用node-red该怎么设计? 数据库表名 website,里面三个字段,id,title,url,status 分别 代表网站的名称,url地址和网站当前的可访问状态。  这里依赖 `node-red-node-mysql` 2.0.0版本的插件,需要你自己手动安装 。 ## 插入一个inject 配置topic: `select * from website`  ## 插入mysql mysql里配置了数据库基本信息,然后这个mysql插件,会自动接入上一节点的msg.topic里的sql语句并执行!这是该组件一个默认的约定。   ## 插入split 上一步mysql会把结果集存到msg.payload中,然后传给split中,在split中我们只需要勾选最下面的对象就行了。split会把结果的列表中的每个item存放到payload中,然后循环请求下一节点,实现自我循环。【这里重点理解一下】  ## 插入一个function 这个function的主要目地是为了把 id,title,url,status 这些信息存到一个临时的变量里,给下下个节点使用,因为http请求这个组件在执行完http请求后,需要把200的状态更新回数据库,但是更新的话得知道 这个200的状态是哪个id的数据。 ~~~ // 保存原始消息数据 msg.originalPayload = msg.payload; return msg; ~~~  ## http请求 这里的url地址写上:`{{{payload.url}}}`,重点!!这个查了很多资料才知道是这么配置。  ## 插入一个function 这个节点里写脚本有点多 `msg.statusCode` 就是拿到http请求里的状态码,至于为什么是这么个写法,暂时还不太清楚,这个 http请求 是用的官方的组件 ,可能 官方定义的写法吧。 `const originalPayload = msg.originalPayload;` 就是把上一个function中缓存的数据在这里再次取出来,因为http请求插件是一个无状态的,不保存任何状态数据,通义千问给的解决方法就是在http之前添加一个 function用来 缓存数据。。。 `msg.topic` 最后组装完成数据,也就是sql语句,放到topic中,传给mysql组件,mysql组件 会自动执行! ~~~js const statusCode = msg.statusCode; // HTTP状态码 const originalPayload = msg.originalPayload; // 恢复原始数据 var msg2 = {} let statusCode2 = ''; if (statusCode === 200) { statusCode2 = 200 msg2 = {payload: {id: originalPayload.id, url: originalPayload.url, title: originalPayload.title, status: '200'}}; } else { statusCode2 = 500 msg2 = {payload: {id: originalPayload.id, url: originalPayload.url, title: originalPayload.title, status: '500'}}; } msg = { ...msg, ...msg2} msg.topic = "update website set `status`="+statusCode2+" where `id` = "+originalPayload.id+";" return msg ~~~  ## 插件最后一个结果回写的mysql组件,用于更新http的访问状态。 `"update website set `status`="+statusCode2+" where `id` = "+originalPayload.id+";"` 上一步组装的sql会自动被这个mysql节点运行。  完整可导入的脚本: ~~~ [ { "id": "448891b52c6e453b", "type": "tab", "label": "流程 2", "disabled": false, "info": "", "env": [] }, { "id": "6002ca5b8902dca0", "type": "inject", "z": "448891b52c6e453b", "name": "", "props": [ { "p": "payload" }, { "p": "topic", "vt": "str" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "select * from website", "payload": "", "payloadType": "date", "x": 410, "y": 320, "wires": [ [ "1f2d4e136172e374" ] ] }, { "id": "1f2d4e136172e374", "type": "mysql", "z": "448891b52c6e453b", "mydb": "2409ec7605fedbe2", "name": "", "x": 480, "y": 220, "wires": [ [ "f5d927a45bcd5a5d" ] ] }, { "id": "f5d927a45bcd5a5d", "type": "split", "z": "448891b52c6e453b", "name": "", "splt": "\\n", "spltType": "str", "arraySplt": 1, "arraySpltType": "len", "stream": false, "addname": "payload", "property": "payload", "x": 650, "y": 220, "wires": [ [ "6718d33d501f66c3" ] ] }, { "id": "462a4581aae04eee", "type": "http request", "z": "448891b52c6e453b", "name": "", "method": "GET", "ret": "txt", "paytoqs": "ignore", "url": "{{{payload.url}}}", "tls": "", "persist": false, "proxy": "", "insecureHTTPParser": false, "authType": "", "senderr": false, "headers": [], "x": 860, "y": 220, "wires": [ [ "a4699d8c0441db23" ] ] }, { "id": "a4699d8c0441db23", "type": "function", "z": "448891b52c6e453b", "name": "function 2", "func": "const statusCode = msg.statusCode; // HTTP状态码\nconst originalPayload = msg.originalPayload; // 恢复原始数据\n\nvar msg2 = {}\nlet statusCode2 = '';\n\nif (statusCode === 200) {\n statusCode2 = 200\n msg2 = {payload: {id: originalPayload.id, url: originalPayload.url, title: originalPayload.title, status: '200'}};\n} else {\n statusCode2 = 500\n msg2 = {payload: {id: originalPayload.id, url: originalPayload.url, title: originalPayload.title, status: '500'}};\n}\n\nmsg = { ...msg, ...msg2}\n\nmsg.topic = \"update website set `status`=\"+statusCode2+\" where `id` = \"+originalPayload.id+\";\"\n\nreturn msg", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 860, "y": 320, "wires": [ [ "dbd1ac5593e6752f" ] ] }, { "id": "6718d33d501f66c3", "type": "function", "z": "448891b52c6e453b", "name": "function 3", "func": "// 保存原始消息数据\nmsg.originalPayload = msg.payload;\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 640, "y": 320, "wires": [ [ "462a4581aae04eee" ] ] }, { "id": "dbd1ac5593e6752f", "type": "mysql", "z": "448891b52c6e453b", "mydb": "2409ec7605fedbe2", "name": "", "x": 1040, "y": 320, "wires": [ [] ] }, { "id": "2409ec7605fedbe2", "type": "MySQLdatabase", "name": "mysql188", "host": "10.168.1.188", "port": "33306", "db": "test", "tz": "", "charset": "UTF8" } ] ~~~
superadmin
2024年11月21日 16:38
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码