javascript - 错误:concatUint8Array:数据必须是 Uint8Array 的形式
问题描述
我正在使用 Jest 来测试我的一个使用 OpenPGP.js https://openpgpjs.org/(最新版本,4.10.9)的小功能。
我看到了一些使用该库的解决方法text-encoding-utf-8
,我在测试中这样做了,但不幸的是,错误仍然存在。
即使:
const textEncoding = await import("text-encoding-utf-8")
global.TextEncoder = textEncoding.TextEncoder
global.TextDecoder = textEncoding.TextDecoder
我的功能:
import * as openpgp from "openpgp"
export async function decryptMessage(privateKeyArmored, passphrase, message) {
const {
keys: [privateKey],
} = await openpgp.key.readArmored(privateKeyArmored)
await privateKey.decrypt(passphrase)
const { data } = await openpgp.decrypt({
message: await openpgp.message.readArmored(message),
privateKeys: [privateKey],
})
return data
}
这是我的测试
import * as openpgp from "openpgp"
import { decryptMessage } from "../src/crypto"
let privateKey
let publicKey
const passphrase = "password"
const oldTextEncoder = global.TextEncoder
const oldTextDecoder = global.TextDecoder
describe("crypto test suite", () => {
beforeAll(async () => {
// workaround to openpgp works with jest
const textEncoding = await import("text-encoding-utf-8")
global.TextEncoder = textEncoding.TextEncoder
global.TextDecoder = textEncoding.TextDecoder
const { privateKeyArmored, publicKeyArmored } = await openpgp.generateKey({
userIds: [{ name: "username" }],
curve: "ed25519",
passphrase,
})
privateKey = privateKeyArmored
publicKey = publicKeyArmored
})
afterAll(() => {
global.TextEncoder = oldTextEncoder
global.TextDecoder = oldTextDecoder
})
test("decrypt message", async () => {
const text = "test"
const { data } = await openpgp.encrypt({
message: openpgp.message.fromText(text),
publicKeys: (await openpgp.key.readArmored(publicKey)).keys,
})
const result = decryptMessage(privateKey, passphrase, data)
expect(result).toBe(text)
})
})
当我跑步时,我得到:
(node:10804) UnhandledPromiseRejectionWarning: Error: concatUint8Array: Data must be in the form of a Uint8Array
(node:10804) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 25)
有什么线索吗?
解决方案
我遇到了同样的问题,然后我不得不使用特定的 openpgp 版本。这最终为我工作:
"openpgp": "4.10.10",
"text-encoding-utf-8": "^1.0.2",
因此,我必须使用这个 openpgp 版本固有的正确功能,如下所示:
test('Encrypts a file using the GPG file', async () => {
const textEncoding = await import("text-encoding-utf-8")
global.TextEncoder = textEncoding.TextEncoder
global.TextDecoder = textEncoding.TextDecoder
const publicKey = fs.readFileSync('/path/file.asc')
const input = fs.createReadStream('a.txt')
const encrypted = await openpgp.encrypt({
message: await openpgp.message.fromBinary(input),
publicKeys: (await openpgp.key.readArmored(publicKey)).keys,
})
console.log(encrypted)
请让我知道这对你有没有用
推荐阅读
- reactjs - useField 钩子的字段显示一个 sessionStorage 条目的值未定义
- angular - 如何在 ngrx/Store 减速器中使用其他 Angular11 服务作为初始状态?
- python - 如何根据表值替换数组中的值?
- c - 如何确定浮点数是否可以在C中被5整除
- drake - 返回在 Drake 中不可行的特定约束
- mongodb - 什么时候需要运行 mongod?
- autodesk - Revit API 2021:ImageType API
- javascript - 在 PayPal 中使用单次结帐支付多个接收方
- user-input - 添加 dateOfBirth 用户属性无法验证提供的信息
- google-bigquery - 查询两个不同行的日期的最佳方法(BigQuery)