Невозможно использовать «fs» в getInitialProps

Я пытаюсь получить содержимое анализируемого файла внутри getInitialProps, когда мой вид загружается, проблема в том, что он говорит мне, что Module not found: Can't resolve 'fs', и я не понимаю, почему - согласно документации, он включает рендеринг на стороне сервера .

Мой маршрут API:

import parseCommands, { ICommands } from "../../modules/parser/json";

export const getCommands = (): ICommands => {
    const commands = parseCommands("data.json");

    return commands;
};

Мой взгляд на реакцию:

import { NextPage } from "next";
import { getCommands } from "../../pages/api/commands";
import { ICommands } from "../../modules/parser/json";
import styles from "./commands.module.scss";

type Props = {
    commands: ICommands;
};

const Commands:NextPage<Props> = ({ commands }) => {
    return (
        <div className = {styles.wrapper}>
            {commands}
        </div>
    );
};

Commands.getInitialProps = async () => {
    const commands:ICommands = await getCommands();

    return {
        commands
    };
};

export default Commands;

Мой файл пытается импортировать модуль «fs»:

import fs from "fs";

[...]

const parseCommands = (path: string): ICommands => {
    const file:string = fs.readFileSync(path, "utf8");
    const json:any = JSON.parse(file);

    const commands:ICommands = parseData(json);

    return commands;
};

export default parseCommands;

Что я делаю не так?

подождите fs во внешнем интерфейсе, это невозможно, SSR известен как рендеринг на стороне сервера, а не операция на стороне сервера, поэтому вы не можете выполнять какие-либо действия на стороне сервера в реакции или в следующем

Nisharg Shah 24.12.2020 20:15

@Nisharg Shah, на самом деле, в Next.js вы можете выполнять рендеринг на стороне сервера.

Or Assayag 24.12.2020 20:21

Отвечает ли это на ваш вопрос? Как использовать модуль node.js с Next.js?

adir abargil 24.12.2020 20:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
3
3
1 803
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам необходимо обновить версию next.js - Обновление для современного Next.js (9.4+)

Вам также может понадобиться создать файл next.config.js со следующим содержимым, чтобы получить клиентский пакет для сборки:

module.exports = {
  webpack: (config, { isServer }) => {
    // Fixes npm packages that depend on `fs` module
    if (!isServer) {
      config.node = {
        fs: 'empty'
      }
    }

    return config
  }
}

getInitialProps работает как на стороне сервера, так и на стороне клиента, поэтому невозможно использовать fs без ветвления. Вместо этого используйте getServerSideProps.

Вы можете отказаться от модуля с ответом Ора, но он просто решает проблему.

Кроме того, вы можете перейти в getInitialProps, чтобы определить, находимся ли мы на сервере во время выполнения кода. Вы не должны использовать readFileSync в коде веб-сервера.


export const getInitialProps = async ({ req }) => {
  if (res === undefined) {
    return { commands: [] }
  }

  const fs = await import('fs')
  const readFile = fs.promises.readFile;
  return { commands: await readFile(...) }
}

Другие вопросы по теме