# Import querySelector function

**URL:** <https://discourse.nodered.org/t/import-queryselector-function/6884>\
**Category:** General\
**Created:** [16 January 2019 13:01 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884 "2019-01-16T13:01:49Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![wojtula](https://avatars.discourse-cdn.com/v4/letter/w/71e660/32.png) [@wojtula](https://discourse.nodered.org/u/wojtula)\
**Post date:** [16 January 2019 13:01 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/1 "2019-01-16T13:01:49Z")

</div>

Hello,  
I was wondering if could I import such function like querySelector or querySelectorAll to use it inside function node?

I've tried with:  
var doc = msg.payload;  
var querySelector = global.get('querySelector');  
doc.querySelector("p");

without success...

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [16 January 2019 13:11 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/2 "2019-01-16T13:11:02Z")

</div>

`querySelector` is not a defined function in node.js - its a browser specific feature.

There are npm modules available to provide similar functionality, such as `cheerio` you could add via `functionGlobalContext`, but for the example code you show, you can use the core `HTML` node to do pretty much exactly that.

---

<div class="post-metadata">

**Author:** ![wojtula](https://avatars.discourse-cdn.com/v4/letter/w/71e660/32.png) [@wojtula](https://discourse.nodered.org/u/wojtula)\
**Post date:** [16 January 2019 13:14 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/3 "2019-01-16T13:14:48Z")

</div>

Thank you, but I would like to import a whole html page inside msg.payload then assigne some string to variables using css selectors in one function node using for example querySelector function.

So should I install npm `cheerio` gloabally then import it?  
var querySelector = global.get('cheerio');

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [16 January 2019 13:17 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/4 "2019-01-16T13:17:54Z")

</div>

> [@wojtula](#):
>
> So should I install npm `cheerio` gloabally then import it?

You should following the docs for loading additional modules here: [Redirecting…](https://nodered.org/docs/writing-functions#loading-additional-modules)

---

<div class="post-metadata">

**Author:** ![wojtula](https://avatars.discourse-cdn.com/v4/letter/w/71e660/32.png) [@wojtula](https://discourse.nodered.org/u/wojtula)\
**Post date:** [16 January 2019 13:34 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/5 "2019-01-16T13:34:25Z")

</div>

ok, thank you.  
I installed [https://www.npmjs.com/package/query-selector](https://www.npmjs.com/package/query-selector) then add line to settings.js:  
functionGlobalContext: {  
qs:require('query-selector')  
// os:require('os'),  
// jfive:require("johnny-five"),  
// j5board:require("johnny-five").Board({repl:false})  
},

then restart node-red and import it by:  
var doc = msg.payload;  
var qs = global.get('qs');  
doc.qs("p");

I got the same issue:  
TypeError: doc.qs is not a function

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [16 January 2019 13:37 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/6 "2019-01-16T13:37:44Z")

</div>

From the readme of the `query-selector` module you have chosen shows it has to be used alongside `jsdom`:

```auto
var querySelectorAll = require('query-selector');
var jsdom = require("jsdom").jsdom;
var doc = jsdom('<html><div id="t"><span>1</span><span>2</span></div></html>');
var time = Date.now();
console.log(doc.querySelectorAll('#t span', doc).length);

```

---

<div class="post-metadata">

**Author:** ![wojtula](https://avatars.discourse-cdn.com/v4/letter/w/71e660/32.png) [@wojtula](https://discourse.nodered.org/u/wojtula)\
**Post date:** [16 January 2019 13:42 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/7 "2019-01-16T13:42:43Z")

</div>

ok i see...  
ok jsdom installed and added:  
functionGlobalContext: {  
qs:require('query-selector')  
jsdom:require('jsdom')  
// os:require('os'),  
// jfive:require("johnny-five"),  
// j5board:require("johnny-five").Board({repl:false})  
},

and... TypeError: doc.qs is not a function

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [16 January 2019 14:04 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/8 "2019-01-16T14:04:03Z")

</div>

Did you modify your Function to match? (and when sharing code _please_ follow the guidance in this post: [How to share code or flow json](https://discourse.nodered.org/t/how-to-share-code-or-flow-json/506))

---

<div class="post-metadata">

**Author:** ![wojtula](https://avatars.discourse-cdn.com/v4/letter/w/71e660/32.png) [@wojtula](https://discourse.nodered.org/u/wojtula)\
**Post date:** [16 January 2019 14:12 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/9 "2019-01-16T14:12:48Z")

</div>

sure:

var doc = msg.payload;  
var qs = global.get('qs');  
var jsdom = global.get('jsdom');  
doc.qs("p");

````auto
[{"id":"8d1a968.84be568","type":"inject","z":"fb6d8306.816e6","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":300,"y":240,"wires":[["c1b49fbb.618cc"]]},{"id":"c1b49fbb.618cc","type":"http request","z":"fb6d8306.816e6","name":"","method":"GET","ret":"txt","url":"http://m.traxelektronik.pl/index.php?type=2&elid=2666","tls":"","x":470,"y":260,"wires":[["48a65208.9610ac"]]},{"id":"48a65208.9610ac","type":"function","z":"fb6d8306.816e6","name":"","func":"var doc = msg.payload;\nvar qs = global.get('qs');\nvar jsdom = global.get('jsdom');\ndoc.qs(\"p\");","outputs":1,"noerr":0,"x":700,"y":300,"wires":[["8cf50587.b5dd98"]]},{"id":"8cf50587.b5dd98","type":"debug","z":"fb6d8306.816e6","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":670,"y":140,"wires":[]}]```
````

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [16 January 2019 14:28 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/10 "2019-01-16T14:28:49Z")

</div>

So you import `jsdom` into your function, but you haven't used it.

Look again at the query-selector example code. Look at where its `doc` variable comes from.

(and please use the ``` quotes around blocks of function code in the same way you did your flow).

---

<div class="post-metadata">

**Author:** ![wojtula](https://avatars.discourse-cdn.com/v4/letter/w/71e660/32.png) [@wojtula](https://discourse.nodered.org/u/wojtula)\
**Post date:** [17 January 2019 09:38 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/11 "2019-01-17T09:38:27Z")

</div>

Ok, I installed cherio as you recommend.  
Another problem:  
`[{"id":"8d1a968.84be568","type":"inject","z":"fb6d8306.816e6","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":300,"y":240,"wires":[["c1b49fbb.618cc"]]},{"id":"c1b49fbb.618cc","type":"http request","z":"fb6d8306.816e6","name":"","method":"GET","ret":"txt","url":"http://m.traxelektronik.pl/index.php?type=2&elid=2666","tls":"","x":470,"y":260,"wires":[["48a65208.9610ac"]]},{"id":"48a65208.9610ac","type":"function","z":"fb6d8306.816e6","name":"","func":"var doc = msg.payload;\n//var qs = global.get('qs');\n//var jsdom = global.get('jsdom');\n//doc.qs(\"p\");\nglobal.get('cherio');\ndoc.nextAll('p')","outputs":1,"noerr":0,"x":690,"y":300,"wires":[["8cf50587.b5dd98"]]},{"id":"8cf50587.b5dd98","type":"debug","z":"fb6d8306.816e6","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":670,"y":140,"wires":[]}]`

TypeError: doc.nextAll is not a function

I would like to get this value:

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/2X/9/9a4fc36eebb5243154bd22bc7750b362709e2211.png)  
from  
[http://m.traxelektronik.pl/index.php?type=2&elid=2666](http://m.traxelektronik.pl/index.php?type=2&elid=2666)

I know that this is possible by html node with selector... I would like to get the same using function node.

---

<div class="post-metadata">

**Author:** ![knolleary](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/knolleary/32/3_2.png) [@knolleary](https://discourse.nodered.org/u/knolleary)\
**Post date:** [17 January 2019 10:32 UTC](https://discourse.nodered.org/t/import-queryselector-function/6884/12 "2019-01-17T10:32:09Z")

</div>

```auto
var doc = msg.payload;
//var qs = global.get('qs');
//var jsdom = global.get('jsdom');
//doc.qs("p");
global.get('cherio');
doc.nextAll('p')

```

I don't see any code using cheerio. In the same way you never used jsdom.

Simply loading the module does not mean `doc` suddenly has all of these extra methods you are trying to use.

Here is the example for Cheerio from its own README:

```auto
const cheerio = require('cheerio')
const $ = cheerio.load('<h2 class="title">Hello world</h2>')
 
$('h2.title').text('Hello there!')

```

Note how it actually uses the cheerio library.
