无法从 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
中添加了 X509Certificate
。 Changelog here。所以它需要那个版本。由于更新的 NodeJS 版本,它可能适用于您的简单项目。
默认情况下,Cypress 使用其捆绑的 NodeJS 版本,从 Cypress 版本 7.0.0
到 8.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.js
或 x509.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
});
});
我正在尝试使用 @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
中添加了 X509Certificate
。 Changelog here。所以它需要那个版本。由于更新的 NodeJS 版本,它可能适用于您的简单项目。
默认情况下,Cypress 使用其捆绑的 NodeJS 版本,从 Cypress 版本 7.0.0
到 8.2.0
,它使用捆绑的 NodeJS 版本 14.16.0
,根据 [=21] =]:
The bundled Node.js version was upgraded from
12.18.3
to14.16.0
.
所以你可以尝试 changing/overriding 将 Cypress 配置中的捆绑 NodeJS 版本升级到版本 15.6.0
,按照这个 configuration:
nodeVersion
您可以导入特定版本,x509.es.js
或 x509.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
});
});