Node.js中fs.readFile返回void的报错原因及解决方法
问题解决:fs.readFile异步导致的类型错误
报错原因
你使用的是fs.readFile的回调式写法,这个函数本身没有返回值(返回类型为void),所以secretKeyString实际是undefined,传给JSON.parse时自然会抛出类型错误。
解决方案
推荐使用异步非阻塞的Promise版本(适合Discord机器人这类事件驱动场景),或者同步读取(不推荐,会阻塞进程):
方案1:用fs/promises + await(推荐)
fs/promises模块提供了Promise化的文件操作方法,配合async函数的await可以优雅处理异步:
import { readFile } from "fs/promises"; // 注意导入路径是fs/promises import { Connection, Keypair } from "@solana/web3.js"; import { getOrca, OrcaFarmConfig, OrcaPoolConfig } from "@orca-so/sdk"; import Decimal from "decimal.js"; const main = async() => { try { // await等待文件读取完成,返回的是Buffer类型 const secretKeyBuffer = await readFile("lp.json"); // 把Buffer转成字符串再解析JSON const secretKey = Uint8Array.from(JSON.parse(secretKeyBuffer.toString())); const owner = Keypair.fromSecretKey(secretKey); // 在这里写后续的业务逻辑 } catch (error) { // 捕获文件读取或JSON解析的错误 console.error("处理密钥文件失败:", error); } }
方案2:同步读取(不推荐)
用readFileSync同步读取文件,会阻塞Node.js事件循环,仅适合简单脚本,不建议在Discord机器人中使用:
import { readFileSync } from "fs"; import { Connection, Keypair } from "@solana/web3.js"; import { getOrca, OrcaFarmConfig, OrcaPoolConfig } from "@orca-so/sdk"; import Decimal from "decimal.js"; const main = () => { try { const secretKeyBuffer = readFileSync("lp.json"); const secretKey = Uint8Array.from(JSON.parse(secretKeyBuffer.toString())); const owner = Keypair.fromSecretKey(secretKey); // 后续逻辑 } catch (error) { console.error("处理密钥文件失败:", error); } }
额外提示
- 确保
lp.json文件路径正确,可使用绝对路径避免相对路径问题; - TypeScript项目需保证
tsconfig.json的target配置不低于ES2017,以支持async/await语法。
内容的提问来源于stack exchange,提问作者Fares_Hassen
相关产品推荐
相关产品推荐

