如何在 NestJS 中使用 Node crypto 消化二进制文件
How to use Node crypto in NestJS to digest binary
我正在尝试将一个预先存在的 NodeJS 项目移植到 NestJS。
我没有使用 require,而是像这样导入库:
import * as crypto from 'crypto';
大部分代码都有效。但是我在以下行中遇到问题:
const hash_digest = hash.update(nonce + message).digest('binary');
问题是“二进制”似乎不是有效类型。事实上,当我点击进入位于 node_modules/@types/node/crypto.d.ts 的源代码时,我看到 BinaryToTextEncoding = 'base64' | 'hex';
是摘要方法的唯一有效类型。
然而,当我 read the documentation 它指出:
hash.digest([encoding])
Calculates the digest of all of the passed data to be hashed. The encoding can be 'hex', 'binary' or 'base64'.
这是这个库的“node”和“nestJS”版本之间的区别还是我缺少什么?
如果这不是一个有效的方法,还有什么办法可以解决这个问题?就目前而言,如果我尝试以下任一操作,我的 nonce 将被视为无效而被拒绝:
const hash_digest = hash.update(nonce + message, 'binary').digest();
const hash_digest = hash.update(nonce + message).digest();
const hash_digest = hash.update(nonce + message, 'binary');
hash_digest = hash.update(nonce + message).digest(<BinaryToTextEncoding>'binary');
这与基于 NodeJS 的框架 NestJS 无关,而与 Typescript 有关,Typescript 是 JavaScript 的超集,它为开发环境增加了类型安全性。 crypto
package for the BinaryToTextEncoding
的打字稿类型表明您可以传入字符串并集,这意味着以下内容之一
type BinaryToTextEncoding = 'base64' | 'hex';
type CharacterEncoding = 'utf8' | 'utf-8' | 'utf16le' | 'latin1';
type LegacyCharacterEncoding = 'ascii' | 'binary' | 'ucs2' | 'ucs-2';
type Encoding = BinaryToTextEncoding | CharacterEncoding | LegacyCharacterEncoding;
// Or in simple terms
type Encoding = 'base64' | 'hex' | 'utf8' | 'utf-8' | 'utf16le' | 'latin1' | 'ascii' | 'binary' | 'ucs2' | 'ucs-2';
这都是针对 Node14 的,因此请确保版本匹配,但它应该接受 binary
作为有效的编码类型。您可能应该做的是使用 update(message, encoding)
格式而不是 update(message).digest(encoding)
方法
Docs for the NodeJS crypto package's update
method
Docs for the update method's encoding type
总的来说,这看起来像是打字稿的差异。您可能会向 DefinitelyTyped repository
提出问题和 PR
update(message, encoding)
方法的编码参数为输入编码,不会影响输出编码。摘要方法将为您提供所需的内容,但输出编码与您的 API 所期望的不匹配。你要找的可能是
const hash_digest = hash.update(nonce + message).digest().toString('binary');
这将计算摘要并使用二进制编码将生成的 Buffer 转换为字符串。
我正在尝试将一个预先存在的 NodeJS 项目移植到 NestJS。
我没有使用 require,而是像这样导入库:
import * as crypto from 'crypto';
大部分代码都有效。但是我在以下行中遇到问题:
const hash_digest = hash.update(nonce + message).digest('binary');
问题是“二进制”似乎不是有效类型。事实上,当我点击进入位于 node_modules/@types/node/crypto.d.ts 的源代码时,我看到 BinaryToTextEncoding = 'base64' | 'hex';
是摘要方法的唯一有效类型。
然而,当我 read the documentation 它指出:
hash.digest([encoding])
Calculates the digest of all of the passed data to be hashed. The encoding can be 'hex', 'binary' or 'base64'.
这是这个库的“node”和“nestJS”版本之间的区别还是我缺少什么?
如果这不是一个有效的方法,还有什么办法可以解决这个问题?就目前而言,如果我尝试以下任一操作,我的 nonce 将被视为无效而被拒绝:
const hash_digest = hash.update(nonce + message, 'binary').digest();
const hash_digest = hash.update(nonce + message).digest();
const hash_digest = hash.update(nonce + message, 'binary');
hash_digest = hash.update(nonce + message).digest(<BinaryToTextEncoding>'binary');
这与基于 NodeJS 的框架 NestJS 无关,而与 Typescript 有关,Typescript 是 JavaScript 的超集,它为开发环境增加了类型安全性。 crypto
package for the BinaryToTextEncoding
的打字稿类型表明您可以传入字符串并集,这意味着以下内容之一
type BinaryToTextEncoding = 'base64' | 'hex';
type CharacterEncoding = 'utf8' | 'utf-8' | 'utf16le' | 'latin1';
type LegacyCharacterEncoding = 'ascii' | 'binary' | 'ucs2' | 'ucs-2';
type Encoding = BinaryToTextEncoding | CharacterEncoding | LegacyCharacterEncoding;
// Or in simple terms
type Encoding = 'base64' | 'hex' | 'utf8' | 'utf-8' | 'utf16le' | 'latin1' | 'ascii' | 'binary' | 'ucs2' | 'ucs-2';
这都是针对 Node14 的,因此请确保版本匹配,但它应该接受 binary
作为有效的编码类型。您可能应该做的是使用 update(message, encoding)
格式而不是 update(message).digest(encoding)
方法
Docs for the NodeJS crypto package's update
method
Docs for the update method's encoding type
总的来说,这看起来像是打字稿的差异。您可能会向 DefinitelyTyped repository
提出问题和 PRupdate(message, encoding)
方法的编码参数为输入编码,不会影响输出编码。摘要方法将为您提供所需的内容,但输出编码与您的 API 所期望的不匹配。你要找的可能是
const hash_digest = hash.update(nonce + message).digest().toString('binary');
这将计算摘要并使用二进制编码将生成的 Buffer 转换为字符串。