Chainlink Functions报错:沙箱源码中找不到./server.js模块求助
解决Hardhat Functions Sandbox无法读取本地server.js的问题
错误原因
Hardhat Functions的functions-simulate命令会将Functions-request-source.js的代码打包到隔离的sandbox环境中运行,这个环境和你的本地server.js不在同一个上下文,因此无论文件路径是否正确,sandbox都无法访问本地模块,直接require('./server.js')必然报错。
正确解决方案
核心思路:不要让Functions-request-source.js依赖本地模块,而是在server.js中执行functions-simulate时,将客户端传入的提示词作为命令行参数传递给sandbox,再在source.js中从args全局变量获取该参数。
步骤1:修改server.js,传递提示词到simulate命令
const express = require('express'); const { exec } = require('child_process'); const app = express(); app.use(express.json()); app.post('/chatgpt', (req, res) => { const prompt = req.body.prompt; // 用JSON.stringify处理参数,避免特殊字符导致命令解析错误 const args = JSON.stringify([prompt]); // 执行simulate并传入参数 exec(`npx hardhat functions-simulate --args ${args}`, (error, stdout, stderr) => { if (error) { console.error(`执行错误: ${error.message}`); return res.status(500).send(error.message); } if (stderr) { console.error(`stderr: ${stderr}`); return res.status(500).send(stderr); } res.send(stdout); }); }); app.listen(3000, () => { console.log('服务器运行在端口3000'); });
步骤2:修改Functions-request-source.js,从args获取提示词
const { ethers } = require("hardhat"); module.exports = async function run() { // 从Hardhat Functions提供的全局args数组中获取提示词 const userPrompt = args[0]; if (!userPrompt) { throw new Error("未传入提示词参数"); } // 这里添加你的ChatGPT调用逻辑 // 示例:调用OpenAI API // const { OpenAI } = require('openai'); // const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }); // const chatCompletion = await openai.chat.completions.create({ // model: "gpt-3.5-turbo", // messages: [{ role: "user", content: userPrompt }], // }); // 返回处理结果(需符合Hardhat Functions的输出格式要求) return ethers.utils.toUtf8Bytes(userPrompt); // 示例返回,根据实际需求修改 };
额外注意事项
- 确保你的
Functions-request-config.js中开启了args支持(默认是开启的),如果需要指定参数类型,可以在config中设置:module.exports = { args: [], // 这里可以留空,因为我们用命令行动态传入 // 其他配置... }; - 如果提示词包含特殊字符(如引号、换行符),
JSON.stringify会自动处理转义,避免命令行解析失败。 - 不要尝试在
source.js中引用任何本地文件,所有依赖的模块需要是npm包(如openai),且要在package.json中声明,Hardhat Functions会自动打包这些依赖到sandbox。
内容的提问来源于stack exchange,提问作者TealWarlock
相关产品推荐
相关产品推荐

