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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:23:28