Node.js报错:password参数未定义,代码无该变量求解决
运行Node.js应用时终端持续抛出TypeError:
TypeError: The "password" argument must be of type string or an instance of ArrayBuffer, Buffer, TypedArray, or DataView. Received undefined
错误栈指向@african-blockchain-center/common模块的加密工具文件,但本地代码里没定义password变量,调试数小时也没在node_modules里找到相关变量。
错误栈详情:
TypeError: The "password" argument must be of type string or an instance of ArrayBuffer, Buffer, TypedArray, or DataView. Received undefined at check (node:internal/crypto/scrypt:89:14) at Object.scryptSync (node:internal/crypto/scrypt:70:13) at Object.<anonymous> (/Users/gokeadewuyi/abc/algorand/node_modules/@african-blockchain-center/common/build/utils/encryption.js:8:30) at Module._compile (node:internal/modules/cjs/loader:1218:14) at Module._compile (/Users/gokeadewuyi/abc/algorand/node_modules/source-map-support/source-map-support.js:568:25) at Module._extensions..js (node:internal/modules/cjs/loader:1272:10) at require.extensions..jsx.require.extensions..js (/private/var/folders/7m/t45z59v16x51rby86nhtvx2m0000gn/T/ts-node-dev-hook-9974711466048651.js:114:20) at Object.nodeDevHook [as .js] (/Users/gokeadewuyi/abc/algorand/node_modules/ts-node-dev/lib/hook.js:63:13) at Module.load (node:internal/modules/cjs/loader:1081:32) at Function.Module._load (node:internal/modules/cjs/loader:922:12)
本地代码:
app.ts
import express from "express"; import "express-async-errors"; import { json } from "body-parser"; import cookieSession from "cookie-session"; import { errorHandler, NotFoundError, currentUser, } from "@african-blockchain-center/common"; const app = express(); app.set("trust proxy", true); app.use(json()); app.use( cookieSession({ signed: false, secure: true, }) ); app.use(currentUser); app.all("*", async (req, res) => { throw new NotFoundError(); }); app.use(errorHandler); export { app };
index.ts
import { app } from "./app"; const start = async () => { if (!process.env.JWT_KEY) { throw new Error("JWT_KEY must be defined"); } app.listen(3000, () => { console.log("algorand-service reporting for duty!"); }); }; start();
这个问题核心是@african-blockchain-center/common模块的加密工具(encryption.js)调用scryptSync时,传入的password参数是undefined,而这个参数大概率依赖某个你没配置的环境变量。
定位依赖的环境变量
直接打开node_modules/@african-blockchain-center/common/build/utils/encryption.js,看第8行附近的代码,确认scryptSync的第一个参数(就是报错的password)是从哪来的。这类加密工具一般会读取环境变量,比如ENCRYPTION_KEY这类名称的变量。补充缺失的环境变量
根据找到的变量名,在项目的环境变量里添加对应值(用足够长的随机字符串就行)。比如如果是ENCRYPTION_KEY,就在.env文件里加:ENCRYPTION_KEY=your-random-encryption-key-here要是用了
dotenv,得确保代码开头先导入dotenv/config,保证环境变量在模块加载前就生效。调整代码加载顺序
有些模块在导入阶段就会执行加密逻辑(你这错误栈就是模块加载时报错),所以得先加载环境变量再导入app。修改index.ts:import dotenv from "dotenv"; dotenv.config(); import { app } from "./app"; const start = async () => { if (!process.env.JWT_KEY) { throw new Error("JWT_KEY must be defined"); } if (!process.env.ENCRYPTION_KEY) { throw new Error("ENCRYPTION_KEY must be defined"); } app.listen(3000, () => { console.log("algorand-service reporting for duty!"); }); }; start();检查版本兼容性
要是配置环境变量后还报错,看看@african-blockchain-center/common的版本和你的Node.js版本兼容不。scryptSync的参数要求在不同Node.js版本里可能有差异,试试升级或降级这个模块版本。
内容的提问来源于stack exchange,提问作者dayo

