Модуль не найден: не удается разрешить «fs» в @google-cloud / хранилище

#node.js #npm #google-cloud-platform #google-cloud-storage #google-apis-explorer

#node.js #npm #google-облачная платформа #google-облачное хранилище #google-api-explorer

Вопрос:

Получение Module not found: Can't resolve 'fs' ошибки при попытке перечислить корзины из хранилища GCP.

 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 этого он находится в google-auth-library модуле, который поставляется вместе с googleapis .

Добавлено использование yarn .

Ответ №1:

Обычно это происходит, когда вы импортируете или ссылаетесь на firebase-admin на стороне клиента, проверьте свой код на наличие неправильного импорта, в котором вы, возможно, вызываете

 import * as firebase from "firebase-admin";
  

вместо

 import firebase from "firebase";
  

Комментарии:

1. Если кто-либо дважды инициализирует firebase в одном и том же скрипте (один раз для администратора и один раз для интерфейса), то это может быть причиной ошибки, поскольку внутренний код пытается запустить интерфейс. Решение: инициализируйте firebase admin в другом скрипте, отличном от интерфейса, и не вызывайте экспорт в бэкэнд-скрипте на интерфейсе.

2. точно, вы поняли мою точку зрения

Ответ №2:

Я столкнулся с той же проблемой, но это руководство было решением в моем случае. Как упоминалось ранее, проблема в том, что firebase-admin пакет предназначен для запуска в среде NodeJS, а не на клиенте. Расширение webpack.config.js или next.config.js с определенными записями не решило проблему для меня.

Я заметил, что вы используете NextJS. Итак, решение состоит в том, чтобы переместить firebase-admin вызовы в API NextJS, который вы можете создать в /pages/api папке.

Вот простой пример извлечения пользовательских данных из клиента.

Вам нужно:

  • /src/lib/firebase.ts : инициализация firebase
  • /src/pages/api/user.ts : Обработчик API NextJS
  • /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

 // /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;
  }
...
  

Ответ №3:

Публикуем решение, представленное в комментариях для наглядности.

В вашей конфигурации 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',
      }
  

Ответ №4:

Сценарий, который вы описываете, в настоящее время обрабатывается Google. Несмотря на отсутствие ETA, проблема является приоритетной.

Комментарии:

1. Есть ли дополнительная документация по этому вопросу или где я мог бы следить за прогрессом?

2. Я смог найти эту ссылку здесь: github.com/googleapis/google-api-nodejs-client/issues/2211 и еще кое-какая информация, которая вам может понадобиться. Хотя вы используете YARN, пожалуйста, посмотрите googleapis / google-auth-library-nodejs#150 (комментарий) «По сути, в вашей конфигурации webpack вы можете указать, что определенные модули, такие как fs, должны быть отключены; в этот момент вы должны иметь возможность запускать эту библиотеку на стороне клиента»

3. Это не ответ на вопрос, это просто комментарий.