我正在编写一个(客户端)JavaScript库(一个节点/角度模块)。
在此库中,我利用了URLSearchParams类。
const form = new URLSearchParams();
form.set('username', data.username);
form.set('password', data.pass);
由于这是一个共享库,因此打包为npm模块。
但是,在运行摩卡单元测试时,出现错误,即未定义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)
最佳答案
更新:节点v10在全局对象上具有URLSearchParams
的内置可用性,因此可以按问题中的预期直接使用。
较旧版本的节点:
一种选择是在测试运行程序的启动脚本中将其设置为全局变量:
import { URLSearchParams } from 'url';
global.URLSearchParams = URLSearchParams
例如,对于Jest,您将使用
setupTestFrameworkScriptFile
指向上面的启动脚本。附带说明一下,如果您想在创建服务器端通用代码的Webpack Webpack bundle 包时获得类似的结果,则可以使用Webpack
ProvidePlugin
来实现:{
name: 'server',
target: 'node',
// ...
plugins: [
// ...
new webpack.ProvidePlugin({
URLSearchParams: ['url', 'URLSearchParams'],
fetch: 'node-fetch',
}),
],
}