diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js index 3bdcf61a1..bdd0d284c 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js @@ -487,7 +487,6 @@ function log_helper(self, level, msg) { level: level, id: self.id, type: self.type, - module: self._module, msg: msg }; if (self._alias) { @@ -500,7 +499,12 @@ function log_helper(self, level, msg) { if (self.name) { o.name = self.name; } - self._flow.log(o); + // See https://github.com/node-red/node-red/issues/3327 + try { + self._flow.log(o); + } catch(err) { + logUnexpectedError(self, err) + } } /** * Log an INFO level message @@ -580,4 +584,59 @@ Node.prototype.status = function(status) { this._flow.handleStatus(this,status); }; + +function inspectObject(flow) { + try { + let properties = new Set() + let currentObj = flow + do { + if (!Object.getPrototypeOf(currentObj)) { break } + Object.getOwnPropertyNames(currentObj).map(item => properties.add(item)) + } while ((currentObj = Object.getPrototypeOf(currentObj))) + let propList = [...properties.keys()].map(item => `${item}[${(typeof flow[item])[0]}]`) + propList.sort(); + let result = []; + let line = ""; + while (propList.length > 0) { + let prop = propList.shift() + if (line.length+prop.length > 80) { + result.push(line) + line = ""; + } else { + line += " "+prop + } + } + if (line.length > 0) { + result.push(line); + } + return result.join("\n ") + + } catch(err) { + return "Failed to capture object properties: "+err.toString() + } +} + +function logUnexpectedError(node, error) { + let moduleInfo = node._module?`${node._module.module}@${node._module.version}`:"undefined" + Log.error(` +******************************************************************** +Unexpected Node Error +${error.stack} +Node: + Type: ${node.type} + Module: ${moduleInfo} + ID: ${node._alias||node.id} + Properties: + ${inspectObject(node)} +Flow: ${node._flow?node._flow.path:'undefined'} + Type: ${node._flow?node._flow.TYPE:'undefined'} + Properties: + ${node._flow?inspectObject(node._flow):'undefined'} + +Please report this issue, including the information logged above: +https://github.com/node-red/node-red/issues/ +******************************************************************** +`) +} + module.exports = Node;