How to use an npm module within a function node?

I would like to use this npm module: https://www.npmjs.com/package/words-to-numbers within a function node.

Can I install the module using npm install words-to-numbers and then refer to it within a function node like this?

const { wordsToNumbers } = require('words-to-numbers');
msg.numbers = wordsToNumbers(msg.payload); 

What I have done is install node-red-contrib-npm and then use that to expose the words-to-numbers module as a custom node. I added the resulting custom node to my flow and it works. However, for my purposes, it would be neater if I could simply refer to it directly within my existing function node.

Look at this

1 Like

Also the documentation is worth checking before asking: https://nodered.org/docs/user-guide/writing-functions#loading-additional-modules

Well, pardon my thick skull because I read both the linked post and the documentation before circling back here to ask how it's done (to get replies to read what I originally failed to understand). :man_shrugging:

I understand I need to install the module like this:

cd ~/.node-red
npm install words-to-numbers

My settings.js currently contains this:

    functionGlobalContext: {
        // os:require('os'),
        // jfive:require("johnny-five"),
        // j5board:require("johnny-five").Board({repl:false})
    },

I assume it should be changed to this and then restart Node-Red to adopt the change:

    functionGlobalContext: {
        // os:require('os'),
        // jfive:require("johnny-five"),
        // j5board:require("johnny-five").Board({repl:false})
        wordsToNumbers:require('words-to-numbers')
    },

Then in the function node, I need to refer to it like this:

// declare it
var wordsToNumbers = global.get("wordsToNumbers");
// proceed to use it ...
msg.numbers = wordsToNumbers(msg.payload);

Is that correct?

Hi @123

for the general question of how to import an npm module, you have it all right.

Where your code will hit an error is more specific to the words-to-numbers function.

In your Function node, the code:

var wordsToNumbers = global.get("wordsToNumbers");

gets the Object returned by the require call. Checking the docs for that module, that Object is not a function you can call directly. Instead, that object has a property called wordsToNumbers and that is the function you want to call.

msg.numbers = wordsToNumbers.wordsToNumbers(msg.payload);

Nick

4 Likes

Thank you for the confirmation.

This became apparent to me when I tried using the word-to-numbers module via the npm node. I had to configure the npm node like this:

Screenshot from 2020-01-27 15-08-24

However, it would have required a few failed attempts before I correctly translated that into:

wordsToNumbers.wordsToNumbers(msg.payload);

so I appreciate your assistance.


I've learned a lot from this experience but, ultimately, I chose to follow a different path. I uninstalled the words-to-numbers module and replaced it with a bespoke solution. I only need to translate numbers from zero to one hundred in increments of five. That's easily done with a map which involves a lot less overhead than the words-to-numbers module. Plus I can share the flow with a fewer prerequisites (i.e. the installation of the words-to-numbers module).

// Convert light level from words to numbers
let words = new Map([
	["zero", 0],
	["five", 5],
	["ten", 10],
	["fifteen", 15],
	["twenty", 20],
	["twenty five", 25],
	["thirty", 30],
	["thirty five", 35],
	["forty", 40],
	["forty five", 45],
	["fifty", 50],
	["fifty five", 55],
	["sixty", 60],
	["sixty five", 65],
	["seventy", 70],
	["seventy five", 70],
	["eighty", 80],
	["eighty five", 85],
	["ninety", 90],
	["ninety five", 95],
	["hundred", 100],
	["one hundred", 100],
	]);

var tmp = words.get(msg.payload);
if (tmp) {
       msg.value = tmp;
       return msg;
}
return null;
2 Likes

Can anybody post a simple flow using number-to-words npm package? I am running node red in HA.

I no longer have the flow containing the words-to-number module. However, the installation process, and using the module, is very easy.

  • Install node-red-contrib-npm via the usual way: Manage Palette > Install

  • After it's installed, find the npm node in the left-hand menu and drag and drop it into the flow you are creating.

  • Double-click the new npm node and enter the following information:

  • The npm node will now download and install the words-to-numbers module (it may take a minute or two).

  • When done, the npm node is now a words-to-numbers node. The node's input accepts numeric words (like fifty five) and the node's output will be numbers (55).

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.