javascript - 如何在 Node 中使用全局 URLSearchParams

标签 javascript node.js

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

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

由于这是一个共享库,它被打包为一个 npm 模块。 但是,在运行 mocha 单元测试时,我收到 URLSearchParams 未定义的错误。原因似乎是该 Node 在全局范围内没有 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 可用于 Node 内的客户端代码,以便我可以使用 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)

最佳答案

更新: Node v10 在全局对象上内置了 URLSearchParams 的可用性,因此可以按照问题中的预期直接使用。

旧版本的 Node:

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

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

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

附带说明,如果您想在创建通用代码的服务器端 Webpack 包时获得类似的结果,您可以使用 Webpack ProvidePlugin 来实现。 :

{
  name: 'server',
  target: 'node',
  // ...
  plugins: [
    // ...
    new webpack.ProvidePlugin({
      URLSearchParams: ['url', 'URLSearchParams'],
      fetch: 'node-fetch',
    }),
  ],
}

关于javascript - 如何在 Node 中使用全局 URLSearchParams,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47266550/

相关文章:

javascript - 如何在客户端存储临时数据,然后将其发送到服务器

javascript - NodeJs:fs.appendFileSync在数据参数 Node v14中不接受数字类型

javascript - co 和 await 的区别

javascript - xhr.upload.addEventListener 加载有空 xhr.responseText

javascript - 为什么我的函数没有返回准确的计数?

javascript - Jqgrid和Zend框架的麻烦

php - Laravel,NPM : Command "mix" not found

javascript - Chart.JS 全宽、响应式圆环图和 Bootstrap

javascript - 为什么下拉菜单在 Node Project的ejs文件中不起作用?

node.js - Google Node.js SDK unicode 上的操作