NodeJS 未找到模块:无法解析@google-cloud/storage上的“文件系统”

mnemlml8  于 2022-12-18  发布在  Node.js
关注(0)|答案(4)|浏览(156)

尝试从GCP存储中列出存储桶时出现Module not found: Can't resolve 'fs'错误。

import { Storage } from '@google-cloud/storage';

const googleCloud = new Storage({
  keyFilename: '../../my-project-c1a44bf80be3.json',
  projectId: 'my-project',
});

googleCloud.getBuckets().then((x: any) => console.log(x));
  • my-project-c1a44bf80be3.json(从GCP下载)存在,并且是项目级别 *

错误:

event - compiled successfully
event - build page: /
wait  - compiling...
error - ./node_modules/@google-cloud/storage/build/src/file.js:24:0
Module not found: Can't resolve 'fs'
null
Could not find files for / in .next/build-manifest.json
event - compiled successfully

使用googleapis时出现相同的错误。但是,它不是在./node_modules/@google-cloud/storage/build/src/file.js:24:0中,而是在googleapis附带的google-auth-library模块中。
使用yarn添加。

t1rydlwq

t1rydlwq1#

当您在客户端导入或引用firebase-admin时,通常会发生这种情况,请检查您的代码中可能调用的错误导入

import * as firebase from "firebase-admin";

代替

import firebase from "firebase";
bejyjqdl

bejyjqdl2#

发布评论中提供的解决方案以供查看。
在您的webpack配置中,您可以指定某些模块(如fs)应该被删除;此时,您应该能够在客户端运行此库。例如:

node: {
        // Some libraries import Node modules but don't use them in the browser.
        // Tell Webpack to provide empty mocks for them so importing them works.
        ...config.node,
        fs: 'empty',
        child_process : 'empty',
        net : 'empty',
        tls: 'empty',
      }
jaql4c8m

jaql4c8m3#

我也遇到过同样的问题,但this guide是我的解决方案。如前所述,问题是firebase-admin包设计为在NodeJs环境中运行,而不是在客户端上运行。用某些条目扩展webpack.config.jsnext.config.js并没有为我解决这个问题。
解决方案是将firebase-admin调用移动到NextJS API,您可以在/pages/api文件夹中创建NextJS API
下面是从客户端获取单个用户数据的示例。
您需要:

  • /src/lib/firebase.ts:firebase初始化
  • /src/pages/api/user.ts:NextJS API处理程序
  • /src/components/xyz.tsx:客户端上的组件,调用API
// /src/lib/firebase.ts
import admin from "firebase-admin";
import { cert } from "firebase-admin/app";
import certConfig from "./firebase-adminsdk-config.json"

admin.initializeApp({
  credential: cert(certConfig)
});
console.log("Firebase initialized.");

export default admin;
// /src/pages/api/user.ts
import admin from 'lib/firebase'

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  const firebase = admin.firestore()
  const collection = firebase.collection('users')

  // get any data from requests body
  const { user } = req.body

  // perform your firebase collection call
  const data = await collection.get(user.id)

  // return data to client
  res.status(200)
  res.json({ 
      success: true, 
      result: data 
  });
    
  return res
}

在客户端,您只需对自己的API执行GET操作

// /src/components/xyz.tsx
...
  const onLogin = async (user) => {
    const response = await fetch(`/api/users`, {
      method: "GET",
      body: JSON.stringify({ user }),
    });

    // data => { success: boolean, result: any }
    const data = await response.json(); 
    return data;
  }
...

jdg4fx2g

jdg4fx2g4#

你所描述的情况现在正在由谷歌处理。虽然没有ETA,但这个问题正在被优先处理。

相关问题