A recent Stack Overflow post had me looking at how to run Node-RED using Visual Code to debug custom nodes. Since I’d not tried Visual Code before (I tend to use Sublime Text 4 as my day to day editor) I thought I’d give it a go and see if I could get it working.
We will start with a really basic test node as an example. This just prints the content of msg.payload
to the console for any message passing through.
test.js
module.exports = function(RED) {
function test(n) {
RED.nodes.createNode(this,n)
const node = this
node.on('input', function(msg, send, done){
send = send || function() { node.send.apply(node,arguments) }
console.log(msg.payload)
send(msg)
done()
})
}
RED.nodes.registerType("test", test)
}
test.html
<script type="text/html" data-template-name="node-type">
</script>
<script type="text/html" data-help-name="node-type">
</script>
<script type="application/javascript">
RED.nodes.registerType('test',{
category: 'test',
defaults: {},
inputs: 1,
outputs: 1,
label: "test"
})
</script>
package.json
{
"name": "test",
"version": "1.0.0",
"description": "Example node-red node",
"keywords": [
"node-red"
],
"node-red": {
"nodes": {
"test": "test.js"
}
},
"author": "ben@example.com",
"license": "Apache-2.0"
}
Setting up
All three files mentioned above are placed in a directory and then the following steps are followed:
- In the Node-RED userDir (normally
~/.node-red
on a Linux machine) run the following command to create a symlink in thenode_modules
directory. This will allow Node-RED to find and load the node.npm install /path/to/test/directory
- Add the following section to the
package.json
file
...
],
"scripts": {
"debug": "node /usr/lib/node_modules/node-red/red.js"
},
"node-red": {
...
Where usr/lib/node_modules/node-red/red.js
is the output from readlink -f `which node-red`
.
You can then add a breakpoint to the code

And then start Node-RED by clicking on the Play button just above the scripts
block.

This will launch Node-RED and attach the debugger and stop when the breakpoint if hit. You can also enable the debugger to stop the application on exceptions, filtering on if they are caught or not.
This even works when using Visual Code’s remote capabilities for editing, running and debugging projects on remote machines. I’ve tested this running over SSH to a Raspberry Pi Zero 2 W (which is similar to the original StackOverflow question as they were trying to debug nodes working with the Pi’s GPIO system). The only change I had to make on the Pi was to increase the default swap file size from 100mb to 256mb as squeezing the Visual Code remote agent and Node-RED into 512mb RAM is a bit of a squeeze.
I might give Visual Code a go as my daily driver in the new year.