我正在编写一个(客户端)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)
答案 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"
...
]
}
}