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

NextJS集成LangChain报错:Module not found: Can't resolve 'fs'

解决NextJS API路由调用FaissStore.load()时的「fs模块找不到」问题

以下是针对该问题的具体排查与解决步骤:

1. 确认API路由的运行环境

NextJS App Router默认使用Edge Runtime,而Edge环境不支持Node.js内置的fs模块。如果你的API路由在App Router下,需显式指定Node.js运行时:

// app/api/chat/route.js 顶部添加
export const runtime = 'nodejs';

Pages Router的API路由默认使用Node.js环境,无需额外配置,但需检查next.config.js中是否全局开启了Edge Runtime的实验性配置,若有则需关闭或单独为该路由覆盖。

2. 调整Webpack打包配置

在next.config.js中添加webpack配置,确保客户端打包时忽略Node.js内置模块,服务端打包时保留:

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: (config, { isServer }) => {
    if (!isServer) {
      // 客户端环境禁用fs等Node.js模块
      config.resolve.fallback = {
        ...config.resolve.fallback,
        fs: false,
        path: false,
        os: false,
      };
    }
    return config;
  },
};

module.exports = nextConfig;

注意必须通过isServer判断区分环境,避免服务端打包时丢失fs依赖。

3. 替换FaissStore.load()的调用方式

若上述配置无效,可手动读取索引文件并通过缓冲区初始化FaissStore,绕开load()方法内部可能的环境判断问题:

import { readFileSync } from 'fs';
import { FaissStore } from '@langchain/community/vectorstores/faiss';
import { OpenAIEmbeddings } from '@langchain/openai';

export async function POST(req) {
  // 手动读取Faiss索引文件
  const faissIndexBuffer = readFileSync('./public/faiss/index.faiss');
  const faissMetaBuffer = readFileSync('./public/faiss/index.pkl');

  // 从缓冲区初始化FaissStore
  const vectorStore = await FaissStore.fromBuffers(
    faissIndexBuffer,
    faissMetaBuffer,
    new OpenAIEmbeddings()
  );

  // 后续业务逻辑...
}

确保索引文件路径正确,且文件存在于服务端可访问的目录下。

4. 检查依赖版本与导入路径

LangChain v0.1+版本后,FaissStore已迁移至@langchain/community包,若仍使用旧的langchain/vectorstores/faiss导入路径,可能导致依赖解析异常。需确认导入路径为:

import { FaissStore } from '@langchain/community/vectorstores/faiss';

同时检查next、langchain、@langchain/community的版本兼容性,避免因版本不匹配导致的打包问题。

内容的提问来源于stack exchange,提问作者Data Mastery

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:52:04