You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:15:48