ReferenceError: Невозможно получить доступ к «Player» до инициализации - PullRequest
2 голосов
/ 08 февраля 2020

Итак, я использовал синтаксис в стиле ES6 с импортом / экспортом на Nodejs с загрузчиком модулей ESM. Все было хорошо, пока я не начал получать сообщение об ошибке импорта.

Вот сообщения об ошибках:

joseph@InsaneMachine:~/placeholder2/main-server$ npm start

> main-server@1.0.0 start /home/joseph/placeholder2/main-server
> nodemon --experimental-modules src/index.mjs

[nodemon] 1.19.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node --experimental-modules src/index.mjs`
(node:16942) ExperimentalWarning: The ESM module loader is experimental.
file:///home/joseph/placeholder2/main-server/src/games/game-player.mjs:3
export default class GamePlayer extends Player
                                        ^

ReferenceError: Cannot access 'Player' before initialization
    at file:///home/joseph/placeholder2/main-server/src/games/game-player.mjs:3:41
    at ModuleJob.run (internal/modules/esm/module_job.js:109:37)
    at async Loader.import (internal/modules/esm/loader.js:132:24)
[nodemon] app crashed - waiting for file changes before starting...

Вот файлы Player (базовый класс):

import PasswordHash from 'password-hash';

import GamesService from '../games/games.service.mjs';

import PlayersService from './players.service.mjs';

import QueueingService from '../queueing/queueing.service.mjs';

export default class Player
{
    constructor(object)
    {
        Object.assign(this, JSON.parse(JSON.stringify(object)));
    }

    get id()
    {
        return this._id.toString();
    }

    equals(other)
    {
        if(other.id != null)
            return other.id == this.id;
        return false;
    }

    checkPassword(password)
    {
        return PasswordHash.verify(password, this.password);
    }

    online()
    {
        return PlayersService.consumer.isPlayerOnline(this);
    }

    inQueue()
    {
        return QueueingService.queued(this);
    }

    inGame()
    {
        return GamesService.getActiveGameByPlayer(this) != null;
    }

    reduce()
    {
        return {
            id: this.id,
            username: this.username,
            email: this.email,
            admin: this.admin,
            online: this.online(),
            in_queue: this.inQueue(),
            in_game: this.inGame(),
        };
    }

    static hashPassword(password)
    {
        return PasswordHash.generate(password);
    }

    static schema = {
        username: String,
        password: String,
        email: String,
        email_confirmed: Boolean,
        admin: Boolean,
    }
}

И GamePlayer (дочерний класс):

import Player from '../players/player.mjs';

export default class GamePlayer extends Player
{
    constructor(player, token)
    {
        super(player);
        this.token = token;
    }
}

И иерархия проекта:

src/
 -- games/
 --  -- game-player.mjs
 --  -- ...
    players/
 --  -- player.mjs
 --  -- ...
 -- ...

Как я могу исправить эту проблему импорта, если это не что-то еще?

Редактировать: Насколько я знаю, я не использую Babel, я использую --external-modules, предоставляемые Node. Не уверен, как это работает.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Я зашел на форумы Node.JS и спросил, в чем может быть проблема. Проблема не вавилонская, просто круговая зависимость. Например:

// A.js
import B from './B.js'
export default class A{}
// B.js
import A from './A.js'
export default class B extends A{}

Извините, информации было недостаточно, чтобы понять это. Я получил большую помощь на node.js github, и кто-то просмотрел мой проект на github и в итоге нашел экземпляр, где два модуля указывали друг на друга.

0 голосов
/ 08 февраля 2020

Удалите es2015 из вашей конфигурации Babel. класс расширяет собственный класс ES6, а Babel переносится в ES, что, скорее всего, вызывает проблему

...