Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use global URLSearchParams in node

I am writing a (client-side) JavaScript library (a node/angular module). In this library, I make use of the URLSearchParams class.

const form = new URLSearchParams(); form.set('username', data.username); form.set('password', data.pass); 

As this is a shared library, it is packed as an npm module. However, when running a mocha unit test, I get the error that URLSearchParams is not defined. The reason seems to be that node does not have URLSearchParams at the global scope, but has to be imported using require('url'):

$ node > new URLSearchParams() ReferenceError: URLSearchParams is not defined     at repl:1:5     at sigintHandlersWrap (vm.js:22:35)     at sigintHandlersWrap (vm.js:73:12)     at ContextifyScript.Script.runInThisContext (vm.js:21:12)     at REPLServer.defaultEval (repl.js:340:29)     at bound (domain.js:280:14)     at REPLServer.runBound [as eval] (domain.js:293:12)     at REPLServer.<anonymous> (repl.js:538:10)     at emitOne (events.js:101:20)     at REPLServer.emit (events.js:188:7) 

How can I make URLSearchParams available to the client-side code within node, so that I can test the library using mocha?

This is not working:

> global.URLSearchParams = require('url').URLSearchParams undefined > new URLSearchParams() TypeError: URLSearchParams is not a constructor     at repl:1:1     at sigintHandlersWrap (vm.js:22:35)     at sigintHandlersWrap (vm.js:73:12)     at ContextifyScript.Script.runInThisContext (vm.js:21:12)     at REPLServer.defaultEval (repl.js:340:29)     at bound (domain.js:280:14)     at REPLServer.runBound [as eval] (domain.js:293:12)     at REPLServer.<anonymous> (repl.js:538:10)     at emitOne (events.js:101:20)     at REPLServer.emit (events.js:188:7) 
like image 310
Martin Nyolt Avatar asked Nov 13 '17 14:11

Martin Nyolt


People also ask

Can I use URLSearchParams in node?

Node is an open source project that is used to create dynamic web applications. The URLSearchParams API is an interface. It defines different utility that is required to work with the query string of the URL.

What is the use of URL library in node JS?

js URL() Method. The 'url' module provides utilities for URL resolution and parsing. The getters and setters implement the properties of URL objects on the class prototype, and the URL class is available on the global object.

What is URLSearchParams?

The URLSearchParams interface defines utility methods to work with the query string of a URL.


1 Answers

Update: Node v10 has built-in availability of URLSearchParams on the global object so it can be used directly as anticipated in the question.

Older versions of Node:

One option is to set it as a global in the start-up script of the test runner:

import { URLSearchParams } from 'url'; global.URLSearchParams = URLSearchParams 

With Jest, for example, you would use the setupTestFrameworkScriptFile to point to the above start-up script.

As a side note, if you wanted to achieve a similar outcome when creating a server-side Webpack bundle of universal code you can achieve this with the Webpack ProvidePlugin:

{   name: 'server',   target: 'node',   // ...   plugins: [     // ...     new webpack.ProvidePlugin({       URLSearchParams: ['url', 'URLSearchParams'],       fetch: 'node-fetch',     }),   ], } 
like image 74
marnusw Avatar answered Oct 13 '22 01:10

marnusw