🎉 Node-RED 3.0 Released

Very cool, thank you. Already download!

Do you also have plans to release a new version of nrLint? nrLint is a great tool, but the current version has a lot of issues. :face_with_thermometer:

Yes, it needs some attention. Of course, anyone else could get involved at help resolve those issues... otherwise it will get updated as soon as I have the bandwidth to do so.

Further data points:

03.0.5060.114 (Official Build) built on Debian 11.3, running on Debian 11.4 (64-bit) 
Revision	a1c2360c5b02a6d4d6ab33796ad8a268a6128226-refs/branch-heads/5060@{#1124}
OS	Linux
JavaScript	V8 10.3.174.18

Chromium on my Pi 4 fails

Revision    564abd8de2c05f45308eec14f9110a10aff40ad9-refs/branch-heads/4515@{#1501}
OS    Linux
JavaScript    V8 9.2.230.17

Chromium on my Pi 4 fails 3 different errors

    at <anonymous>:225:76
    at Array.map (<anonymous>)
    at Array.handleDebugMessage (<anonymous>:220:47)
    at WebSocket.i.onmessage (red.min.js?v=3.0.0:16)
(anonymous) @ VM389:225
handleDebugMessage @ VM389:220
i.onmessage @ red.min.js?v=3.0.0:16
red.min.js?v=3.0.0:18 Uncaught TypeError: Object.hasOwn is not a function
    at SVGGElement.<anonymous> (red.min.js?v=3.0.0:18)
    at vendor.js?v=3.0.0:37
    at Tn (vendor.js?v=3.0.0:35)
    at Array.Ma.each (vendor.js?v=3.0.0:37)
    at Gt (red.min.js?v=3.0.0:18)
(anonymous) @ red.min.js?v=3.0.0:18
(anonymous) @ vendor.js?v=3.0.0:37
Tn @ vendor.js?v=3.0.0:35
Ma.each @ vendor.js?v=3.0.0:37
Gt @ red.min.js?v=3.0.0:18
requestAnimationFrame (async)
H @ red.min.js?v=3.0.0:18
redraw @ red.min.js?v=3.0.0:18
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
d @ red.min.js?v=3.0.0:16
(anonymous) @ red.min.js?v=3.0.0:16
(anonymous) @ red.min.js?v=3.0.0:18
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
S.<computed> @ vendor.js?v=3.0.0:2
getJSON @ vendor.js?v=3.0.0:2
(anonymous) @ red.min.js?v=3.0.0:18
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
S.<computed> @ vendor.js?v=3.0.0:2
getJSON @ vendor.js?v=3.0.0:2
refresh @ red.min.js?v=3.0.0:18
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
load (async)
(anonymous) @ red.min.js?v=3.0.0:16
each @ vendor.js?v=3.0.0:2
each @ vendor.js?v=3.0.0:2
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
s @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
t @ red.min.js?v=3.0.0:16
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
r @ red.min.js?v=3.0.0:16
(anonymous) @ red.min.js?v=3.0.0:16
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
(anonymous) @ red.min.js?v=3.0.0:16
loadNodeCatalogs @ red.min.js?v=3.0.0:16
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
i @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
a @ red.min.js?v=3.0.0:16
n @ red.min.js?v=3.0.0:16
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
(anonymous) @ red.min.js?v=3.0.0:16
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
(anonymous) @ red.min.js?v=3.0.0:16
loadPluginCatalogs @ red.min.js?v=3.0.0:16
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
i @ red.min.js?v=3.0.0:16
(anonymous) @ red.min.js?v=3.0.0:16
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
d @ red.min.js?v=3.0.0:16
(anonymous) @ red.min.js?v=3.0.0:16
success @ red.min.js?v=3.0.0:16
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
l @ vendor.js?v=3.0.0:2
(anonymous) @ vendor.js?v=3.0.0:2
load (async)
send @ vendor.js?v=3.0.0:2
ajax @ vendor.js?v=3.0.0:2
s.ajax @ vendor.js?v=3.0.0:4
r @ red.min.js?v=3.0.0:16
i @ red.min.js?v=3.0.0:16
init @ red.min.js?v=3.0.0:16
(anonymous) @ red.min.js?v=3.0.0:16
(anonymous) @ red.min.js?v=3.0.0:16
e @ vendor.js?v=3.0.0:38
(anonymous) @ vendor.js?v=3.0.0:38
(anonymous) @ vendor.js?v=3.0.0:38
(anonymous) @ vendor.js?v=3.0.0:38
(anonymous) @ vendor.js?v=3.0.0:38
value @ vendor.js?v=3.0.0:38
(anonymous) @ vendor.js?v=3.0.0:38
(anonymous) @ vendor.js?v=3.0.0:38
(anonymous) @ vendor.js?v=3.0.0:39
(anonymous) @ vendor.js?v=3.0.0:39
Promise.then (async)
(anonymous) @ vendor.js?v=3.0.0:39
Promise.then (async)
(anonymous) @ vendor.js?v=3.0.0:39
i.default @ vendor.js?v=3.0.0:39
value @ vendor.js?v=3.0.0:39
(anonymous) @ vendor.js?v=3.0.0:39
Promise.then (async)
value @ vendor.js?v=3.0.0:39
value @ vendor.js?v=3.0.0:39
value @ vendor.js?v=3.0.0:38
value @ vendor.js?v=3.0.0:38
(anonymous) @ vendor.js?v=3.0.0:38
value @ vendor.js?v=3.0.0:38
value @ vendor.js?v=3.0.0:38
value @ vendor.js?v=3.0.0:38
i @ vendor.js?v=3.0.0:38
value @ vendor.js?v=3.0.0:38
f @ vendor.js?v=3.0.0:38
setTimeout (async)
value @ vendor.js?v=3.0.0:38
init @ red.min.js?v=3.0.0:16
init @ red.min.js?v=3.0.0:16
(anonymous) @ main.min.js?v=3.0.0:16
e @ vendor.js?v=3.0.0:2
t @ vendor.js?v=3.0.0:2
setTimeout (async)
(anonymous) @ vendor.js?v=3.0.0:2
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
fire @ vendor.js?v=3.0.0:2
c @ vendor.js?v=3.0.0:2
fireWith @ vendor.js?v=3.0.0:2
ready @ vendor.js?v=3.0.0:2
B @ vendor.js?v=3.0.0:2
Show 200 more frames
red.min.js?v=3.0.0:18 Uncaught TypeError: Object.hasOwn is not a function
    at SVGGElement.<anonymous> (red.min.js?v=3.0.0:18)
    at vendor.js?v=3.0.0:37
    at Tn (vendor.js?v=3.0.0:35)
    at Array.Ma.each (vendor.js?v=3.0.0:37)
    at Gt (red.min.js?v=3.0.0:18)

Ah, that's not so good if that is in the editor.

It has only being available since the middle of 2021 and still isn't supported by all browsers.

"hasown" | Can I use... Support tables for HTML5, CSS3, etc

For chromium to be failing, it would have to be version 92 or earlier. That is (in terms of browsers) old and unsafe!

It is a known issue: Links between nodes disappear after upgrade to 3.0 under Safari · Issue #3778 · node-red/node-red · GitHub

For now the solution is to update your browser.

ps: sorry about the typing and typos my thumb is in a pot

Seems like a couple of focus issues with the new (and awesome) release:

  1. CTRL+ENTER to confirm and close dialogs, only in case of multi page dialogs. Such case reproduces with the inject or change nodes, where you would set a field to be of type jsonata, after opening the jsonata expression dialog and setting content, it can be closed with "Done" mouse click on the button or CTRL+ENTER key combination (win10). The jsonata dialog will confirm and close but the edit change/inject node will note also submit on another CTRL+ENTER key press, only via mouse click.

  2. Right click on the main canvas (empty area) > get the new context menu > select insert > node > the cursor does not go to the search box and typing / keyboard browsing will not work unless setting the focus onto the search bar.

Happy here! Thank you!

Agreed, it's 92. Seems Debian is slow to update on the Pi. I should check for the 64bit Linux to see if that has a later version.

Thanks good information.

Very pleased to see the Monaco editor at work in my flows. I know that it's been available for sometime, but I was slow to adopt it. Of course it is the default with 3.0, so I decided to give it a go. I have some very extensive function blocks and I'm delighted that all of my syntax plays very nice with Monaco. It's a good user experience!

Thanks Team!

1 Like

Upgraded, Installed Node-RED 3.0.0... :frowning_face:

It gets stuck here. I blocked out my info in the path. I did a classic global install on my system running 2.?? (last 2.? install version) Windows 10 Node

image

Log entry
1195 verbose stack Error: EBUSY: resource busy or locked, copyfile
'C:\Users\blah.blahblah\AppData\Roaming\npm\node_modules\node-red\node_modules\bcrypt\lib\binding\napi-v3\bcrypt_lib.node' ->
'C:\Users\blah.blahblah\AppData\Roaming\npm\node_modules.node-red-hGBPYeBB\node_modules\bcrypt\lib\binding\napi-v3\bcrypt_lib.node'

1205 error errno -4082

Try npm cache clean
and also running npm install -g --unsafe-perm node-red
from Command prompt as administrator instead of Powershell

ps. did you stop NR before running the upgrade ?

OOPS!. I HAD it running as a service. Thanks. A little "stop and think about what your doing" goes a long way.

Thanks for that fix. I'll try it when I can get to it later tomorrow.

Kind Thanks!

1 Like

Issue solved with release 3.0.1. Thank you!

Issue solved with release 3.0.1 . Thank you!

TBH @rei_vilo and @sanyafifa - I was personally in 2 minds on whether to "fix" this one - I guess you did not update your browsers!

From the web...

According to Google's blog post announcing Chrome 93, the latest version of the web browser fixed 27 security flaws, and five of those flaws carried a “high” risk ranking .

And Chrome(ium) 93 is not even the latest - current version is 103 (11 whole revisions newer!)

I hope you dont use them online :stuck_out_tongue:

Let's Please remember that some people may be using node-red on old iPads so may not be connected to the Internet but still need to use older versions of browsers.

1 Like

Also the FireFox ESR release which many people will be using. Doesn't have all the latest features, but does get regular security fixes. It was discovering we were broken on that which urged me to get 3.0.1 released sooner rather than later.

3 Likes

Valid points guys.

I am constantly updating raspbian os. The new version of chrome is not in the repository. And I use a firewall :slight_smile: