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)
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.
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.
The URLSearchParams interface defines utility methods to work with the query string of a URL.
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', }), ], }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With