无法从 Cypress 规范文件导入模块

Cannot import module from Cypress spec file

我正在尝试使用 @peculiar/x509 库来解码 CSR,以便在我的测试中使用一些信息。测试使用的是 Cypress。

这是我的代码的摘录:

import * as x509 from '@peculiar/x509';
    
const request = {
  certificateSigningRequest: `-----BEGIN CERTIFICATE REQUEST-----
...
-----END CERTIFICATE REQUEST-----`,
};
    
describe('PKI', () => { 
  it('works', () => {
    console.log(x509);
    const stringPEM = request.certificateSigningRequest
      .replace(/(-----(BEGIN|END) CERTIFICATE REQUEST-----|\n)/g, "");
    const cert = new x509.X509Certificate(stringPEM);
    console.log(cert.subject);
    
    return;
    // Stuff I want to test
  });    
});

当我尝试记录 x509 变量时,它 returns 是一个空对象。
const cert = new x509.X509Certificate(stringPEM); 行,我得到一个错误:

x509.X509Certificate is not a constructor.

如果我尝试使用 Typescript 文件设置一个简单的项目来导入库并只记录 x509 变量,它会正确显示所有导出。

我不明白为什么它与 Cypress 的行为一样,所以非常感谢您的帮助。

编辑:深入了解 Cypress 的工作原理,我现在明白我对 Node 进程中的规范文件 running/controlled 的假设是错误的。规范文件在浏览器中为 运行。所以我需要在规范文件中注入库的浏览器版本。 这可以通过 Cypress 的插件 API 来完成,因为它运行在 Cypress 节点进程中。

可能是NodeJS版本问题。

最近在 NodeJS 版本 15.6.0 中添加了 X509CertificateChangelog here。所以它需要那个版本。由于更新的 NodeJS 版本,它可能适用于您的简单项目。

默认情况下,Cypress 使用其捆绑的 NodeJS 版本,从 Cypress 版本 7.0.08.2.0,它使用捆绑的 NodeJS 版本 14.16.0,根据 [=21] =]:

The bundled Node.js version was upgraded from 12.18.3 to 14.16.0.

所以你可以尝试 changing/overriding 将 Cypress 配置中的捆绑 NodeJS 版本升级到版本 15.6.0,按照这个 configuration:

nodeVersion

您可以导入特定版本,x509.es.jsx509.cjs.js 并且您的代码有效。基数 @peculiar/x509 用于 <script> 包含。

有一件事,BEGIN 和 END 令牌需要保留在请求中才能被识别。

import * as x509 from '@peculiar/x509/build/x509.es.js'
// const x509 = require('@peculiar/x509/build/x509.cjs.js')  // alternative

// hard left for multiline strings, otherwise request is not correctly formatted
const request = {
  certificateSigningRequest: `-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----`,
};

// copied from @peculiar/x509 to verify format - not necessary for test
const isPem = (data) => {
  return typeof data === "string"
    && /-{5}BEGIN [A-Z0-9 ]+-{5}([a-zA-Z0-9=+/\n\r]+)-{5}END [A-Z0-9 ]+-{5}/g.test(data);
}
console.log(isPem(request.certificateSigningRequest))

describe('PKI', () => {

  it('works', () => {
    console.log(x509);
    const stringPEM = request.certificateSigningRequest // leave in BEGIN and END
    const cert = new x509.X509Certificate(stringPEM);
    console.log(cert.subject);    // prints e.g. "CN=Test certificate, E=some@email.net"

    return;
    // Stuff I want to test
  });

});