找不到模块:错误:无法解析“密码”

时间:2019-01-12 17:47:43

标签: javascript node.js angular npm nem

运行ng serve时出现以下错误列表。

我的程序包JSON如下:

{   "name": "ProName",   "version": "0.0.0",   "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"   },   "private": true,   "dependencies": {
    "@angular-devkit/build-angular": "~0.12.0",
    "@angular/animations": "5.2.10",
    "@angular/common": "5.2.10",
    "@angular/compiler": "5.2.10",
    "@angular/compiler-cli": "5.2.10",
    "@angular/core": "5.2.10",
    "@angular/forms": "5.2.10",
    "@angular/platform-browser": "5.2.10",
    "@angular/platform-browser-dynamic": "5.2.10",
    "@angular/router": "5.2.10",
    "@types/dotenv": "^4.0.3",
    "@types/errorhandler": "0.0.32",
    "@types/express": "^4.16.0",
    "@types/node": "^10.5.1",
    "apostille-library": "^7.1.0",
    "core-js": "^2.5.4",
    "dotenv": "^6.0.0",
    "errorhandler": "^1.5.0",
    "express": "^4.16.0",
    "nem2-sdk": "^0.9.7",
    "rxjs": "~6.3.3",
    "stream": "0.0.2",
    "tslib": "^1.9.0",
    "typescript": "^2.9.2",
    "zone.js": "~0.8.26"   } }

我得到的错误:

  ./node_modules/aws-sign2/index.js中的

ERROR找不到模块:错误:   无法解析“密码”   '/用户/ MYPC /文档/ Myproj / ProName / node_modules / aws-sign2'错误   ./node_modules/aws4/aws4.js找不到模块:错误:无法解析   '/用户/ MYPC /文档/ Myproj / ProName / node_modules / aws4'中的'crypto'   ./node_modules/ecc-jsbn/index.js中的错误找不到模块:错误:   无法解析“密码”   '/用户/ MYPC /文档/ Myproj / ProName / node_modules / ecc-jsbn'错误   ./node_modules/http-signature/lib/verify.js找不到模块:错误:   无法解析“密码”   '/用户/ MYPC /文档/ Myproj / ProName / node_modules / http签名/ lib'   找不到./node_modules/http-signature/lib/signer.js模块中的错误:   错误:无法解析“密码”   '/用户/ MYPC /文档/ Myproj / ProName / node_modules / http签名/ lib'   ./node_modules/nem-sdk/build/external/nacl-fast.js中的模块错误   找到:错误:无法解析“ crypto”   '/用户/ MYPC /文档/ Myproj / ProName / node_modules / nem-sdk / build / external'   ./node_modules/nem-sdk/node_modules/aws-sign2/index.js中的错误

11 个答案:

答案 0 :(得分:15)

将此项目添加到该项目下的 tsconfig.ts 文件中可解决此警告

"compilerOptions": {
"baseUrl": "./",
"paths": {
  "crypto": [
    "../../node_modules/crypto-js"
  ]
}

答案 1 :(得分:13)

在 Angular 11 和 crypto-js 4 遇到同样的问题(并在 tsconfig.json 中手动设置路径)后,我发现将 crypto-js 回滚到版本 3.1.9-1 解决了这个问题。似乎是在第 4 版中所做的更改导致了该问题。

npm install crypto-js@3.1.9-1

在回购问题中解释:

GitHub issue

答案 2 :(得分:5)

我最近在尝试使用的一个小型项目中尝试使用另一个库(tiff.js)时遇到了类似的问题。

我要解决的方法是在devDependencies部分之后,将以下内容添加到我的 package.json 文件中。

"devDependencies": {
    ...
},
"browser": {
    "crypto": false
}

在尝试在应用程序中使用库时,这似乎没有任何不利影响。

答案 3 :(得分:4)

我想我会进一步介绍Tarique Ahmed在他的回答中写的内容。

我正在使用一个npm模块,其代码中包含以下行:

const crypto = require('crypto');

我无法添加:

"browser": {
  "crypto": false
}

到package.json,因为crypto包必须是构建的一部分。

事实证明,在编译过程中,Angular似乎决定安装crypto-browserify软件包而不是crypto

tsconfig.json文件中添加以下内容指示该构建每次需要crypto-browserify时都使用crypto库。如您所见,我在stream包中遇到了同样的问题。

"paths": {
  "crypto": [
    "node_modules/crypto-browserify"
  ],
  "stream": [
    "node_modules/stream-browserify"
  ]
}

答案 4 :(得分:4)

如果您升级到 Webpack 5,则需要将其添加到您的 webpack 配置文件

resolve: {
    fallback: { crypto: false },
},

答案 5 :(得分:2)

我喜欢R. Richards的答案,但我认为提供更多信息会很有用。

这是Angular的一个已知问题,并且Angular CLI开发团队似乎认为这是功能而不是错误。我和this issue thread中的其他开发人员不同意。该线程的提供者提供了几种解决方法,但在实施R. Richards的解决方案之前,我的项目无法成功编译。不过,我没有还原以前的更改,因此tacnomanGrandSchtroumpf的修复可能对其他人有用。

有些人(例如此处的clovis1122以及该问题线程中的其他人)质疑为什么Web应用程序需要访问这些库,以及为什么不能在服务器端完成必要的任务。我不能代表所有人,但是我的用例是,在对用户帐户进行身份验证时,Strapi会使用必须由客户端解码的JSON Web令牌字符串进行响应。由于the necessary library依赖于cryptostream,除非这些依赖项可用,否则您将无法提取JWT到期时间。

万一有人无法从R. Richards的答案中推断出问题,则必须将出现在“无法解析x”错误中的所有依赖项设置为false。例如,我package.json的关键部分是:

    "browser": {
        "crypto": false,
        "stream": false
    }

答案 6 :(得分:1)

aws-sign2是NodeJS程序包(而crypto是NodeJS模块),但看起来您正在处理Web应用程序。在该环境中无法使用crypto模块。

能否完成服务器端所需的操作?否则,您可能需要寻找其他包装。

答案 7 :(得分:0)

经过深入研究,我发现解决方案非常简单:替换 从'crypto-js'导入*作为CryptoJS;与声明var CryptoJS;

答案 8 :(得分:0)

使用直接导入可能不适用于 ES6 环境..

这可能对您有所帮助。

$ npm i crypto-js@latest // 用于使用最新版本 4

import AES from 'crypto-js/aes';
import Utf8 from 'crypto-js/enc-utf8';
import { secretKey } from './environments/environment';

/** Encryption */
const data = {key: 'Test Value'};
const ciphertext = AES.encrypt(JSON.stringify(data), secretKey).toString();
console.log('Encrypted Data', ciphertext);

/** Decryption */
const bytes = AES.decrypt(ciphertext, secretKey);
const decryptedData = JSON.parse(bytes.toString(Utf8));
console.log('Decrypted Data', decryptedData);

https://github.com/brix/crypto-js/issues/168#issuecomment-785617218

答案 9 :(得分:0)

在数组中添加带有文字“crypto-js”的 allowedCommonJsDependencies 选项,这在文件 angular.json 中:

"architect": 
        "build": {              
          "options": {               
            "allowedCommonJsDependencies": [
              "crypto-js"
            ]
          },
         }
 }

这将禁用在 Angular 11 中测试的所有警告。

答案 10 :(得分:0)

对于 Laravel Inertia JS 项目,我的解决方案是:

1- 向 package.json 添加依赖

   "dependencies": {
        "crypto-browserify": "3.12.0",
        "crypto-random-string": "^3.3.0",
        "stream": "^0.0.2"
    }

2-在 webpack.config.js 中:

const path = require('path');

module.exports = {
    resolve: {
        alias: {
            '@': path.resolve('resources/js'),
        },
        fallback: {
            crypto: require.resolve('crypto-browserify'),
            stream: require.resolve('stream'),
        },
    },
};

3-安装、构建和运行:

npm install && npm run watch