如何在节点中使用全局URLSearchParams

时间:2017-11-13 14:23:45

标签: javascript node.js

我正在编写一个(客户端)JavaScript库(节点/角度模块)。 在这个库中,我使用了URLSearchParams类。

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

由于这是一个共享库,因此它被打包为npm模块。 但是,在运行mocha单元测试时,我收到了未定义URLSearchParams的错误。原因似乎是节点在全局范围内没有URLSearchParams,但必须使用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)

如何让URLSearchParams可用于节点内的客户端代码,以便我可以使用mocha测试库?

这不起作用:

> 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)

4 个答案:

答案 0 :(得分:16)

更新:节点v10在全局对象上具有class A { public static void main(String[] args) { try { String nn = args[0]; int n = Integer.parseInt(nn); int[] a = new int[n]; for (int i = 0; i < n; i++) { // your implementation goes here } } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Please specify a argument"); } catch (NumberFormatException e) { System.out.println("Argument must be a integer value"); } } } 的内置可用性,因此可以直接在问题中使用它。

较早版本的Node:

一种选择是在测试运行器的启动脚本中将其设置为全局:

URLSearchParams

例如,使用Jest,您可以使用setupTestFrameworkScriptFile指向上面的启动脚本。

作为旁注,如果您想在创建服务器端Webpack通用代码包时获得类似的结果,您可以使用Webpack ProvidePlugin实现此目的:

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

答案 1 :(得分:3)

在使用Node8.10的AWS Lambda中,我必须做:

const URLSearchParams = require('url').URLSearchParams
const sp = new URLSearchParams(request.querystring)

const url = require('url')
const sp = new url.URLSearchParams(request.querystring)

答案 2 :(得分:0)

如果我们想在我们的应用程序中支持大范围的nodejs版本,则可以使用一些肮脏的代码,例如:

if(typeof URLSearchParams === 'undefined'){
    URLSearchParams = require('url').URLSearchParams;
}

注意:最好require有条件。

答案 3 :(得分:0)

您可以使用polifill @ ungap / url-search-params https://www.npmjs.com/package/@ungap/url-search-params,对于Webpack,可以使用 @ ungap / url-search-params / cjs < / p>

旧的 NodeJS 8 (在AWS和GCloud中使用)不支持URLSearchParams,因此此策略填充会有所帮助。

节点10 中,使用TypeScript时,您可以启用库 dom ,其中包括URLSearchParams实现。更改 tsconfig.json

{
  "compilerOptions": {
    "lib": [
      ...
      "dom"
      ...
    ]
  }
}