Unn*_*son 7 javascript node.js typescript angular
我创建了我自己的需要加密的hash.js文件,并导出了两个使用加密的函数。当我对密码进行哈希处理时,它在我的api.js文件中工作正常。但是,现在我试图将此文件导入到user.service.ts文件中,以便可以将密码的哈希版本作为查询参数而不是密码本身发送。当我尝试这样做时,我总是收到TypeScript错误,告诉我crypto使用的函数不是函数。但是,我仍然可以控制台日志记录导入的对象,对我来说它看起来合法。我查看了node_modules文件夹中的其他Java脚本文件,但看不到任何文件错误。
我还发现似乎需要创建一些定义文件,但是我也曾尝试过创建这样的文件,但似乎无济于事
几个小时的谷歌搜索以及对该项目的时间不足导致的知识不足,这使我成为了这篇文章,这是我的第一个stackoverflow帖子,我希望它不会不清楚,我很高兴提供任何需要的信息来帮助我解决此问题。
LoginComponent.html:18 ERROR TypeError: crypto.randomBytes is not a function
at Object.genRandomString (hash.js:12)
at UserService.loginUser (user.service.ts:82)
at LoginComponent.getUser (login.component.ts:54)
at LoginComponent.onSubmit (login.component.ts:44)
at Object.eval [as handleEvent] (LoginComponent.html:18)
at handleEvent (core.es5.js:12014)
at callWithDebugContext (core.es5.js:13475)
at Object.debugHandleEvent [as handleEvent] (core.es5.js:13063)
at dispatchEvent (core.es5.js:8607)
at core.es5.js:10775
LoginComponent.html:18 ERROR CONTEXT DebugContext_ {view: {…}, nodeIndex: 31, nodeDef: {…}, elDef: {…}, elView: {…}}
Run Code Online (Sandbox Code Playgroud)
hash.js文件
'use strict';
var crypto = require('crypto');
/**
* generates random string of characters i.e salt
* @function
* @param {number} length - Length of the random string.
*/
function genRandomString (length){
return crypto.randomBytes(Math.ceil(length/2))
.toString('hex') /** convert to hexadecimal format */
.slice(0,length); /** return required number of characters */
};
/**
* hash password with sha512.
* @function
* @param {string} password - List of required fields.
* @param {string} salt - Data to be validated.
*/
function sha512(password, salt){
var hash = crypto.createHmac('sha512', salt); /** Hashing algorithm sha512 */
hash.update(password);
var value = hash.digest('hex');
return {
salt:salt,
passwordHash:value
};
};
module.exports = {
genRandomString: genRandomString,
sha512: sha512
};
Run Code Online (Sandbox Code Playgroud)
似乎混用了JavaScript和TypeScript,但由于我自己遇到了这个问题,因此这是我解决的方法。
首先,您的hash.js文件应为hash.ts。然后,您可以导入加密货币并正常使用它。相关代码如下:
import * as crypto from "crypto";
public setEncryptionKeyDES(sKey: string) {
const desIV = Buffer.alloc(8);
this.encLobby.cipher = crypto.createCipheriv(
"des-cbc",
Buffer.from(sKey, "hex"),
desIV,
);
this.encLobby.cipher.setAutoPadding(false);
this.encLobby.decipher = crypto.createDecipheriv(
"des-cbc",
Buffer.from(sKey, "hex"),
desIV,
);
this.encLobby.decipher.setAutoPadding(false);
this.isSetupComplete = true;
}
Run Code Online (Sandbox Code Playgroud)
刚刚遇到这个问题(节点 v13.12.0,tsc v3.8.3)。在我的情况下,导入:
import * as crypto from "crypto";
Run Code Online (Sandbox Code Playgroud)
给出错误:
error TS2307: Cannot find module 'crypto'
Run Code Online (Sandbox Code Playgroud)
因为我必须为节点安装类型定义:它包括加密环境声明。
npm install @types/node
Run Code Online (Sandbox Code Playgroud)
注意:如果您有一个全局安装,@types/node那么您必须@types
使用--typesRoot选项显式声明位于何处的路径。有关详细信息,请参见此处。
当我尝试这样做时,我总是收到 TypeScript 错误,告诉我 crypto 使用的函数不是函数。
发生这种情况是因为 TypeScript 静态分析您的文件并尝试帮助您处理正在使用的数据类型。如果您使用的是用 JavaScript 编写的函数,而没有向 TypeScript 提供任何有关该函数用作参数的内容以及其返回值的类型的提示,则它根本无法完成其工作,这就是您收到错误的原因。
您可以创建一个声明文件,但如果您想要快速修复并且不会在其他文件中使用这些原始 JS 函数,则不需要创建。您只需在文件中的任何位置声明它即可。您可以阅读有关declare在 TypeScript 中使用关键字的更多信息。
不过,我仍然可以通过控制台记录我导入的对象,并且它对我来说看起来是合法的。
从您的屏幕截图来看,该函数randomBytes被正确调用(正如您从错误下方打印的堆栈跟踪中看到的那样)。问题是该crypto对象不包含名为 的方法randomBytes。这是因为crypto在较新的浏览器中 是一个全局对象。
您的crypto.js文件可能假设存在crypto与浏览器不同的全局对象。要么在适当的范围内提供此对象,以便您的函数可以看到它,要么使用打包器(例如 Rollup)内联这些函数。
| 归档时间: |
|
| 查看次数: |
5453 次 |
| 最近记录: |