Узел + create-реагировать-приложение + Express - как импортировать функцию в Express - PullRequest
0 голосов
/ 23 марта 2020

Я использую socket.IO, работающий в Express, для распределения данных между клиентами. Чтобы получить эти данные, мне нужно использовать функцию из другого файла. Теперь, если я правильно понимаю, Node + Express не поддерживает ключевые слова импорта / экспорта, которые я использую на стороне клиента (React) приложения. Из-за этого я использовал «require» внутри файла сервера:

server. js

const initialStateFunctions  = require("../components/functions/InitialStateFunctions");
const playerStates = initialStateFunctions.getInitialPlayerStates();

InitialStateFunctions. js

import {shuffleArray} from "./CardManipulationFuntions";
import {ARTIFACTS, CARD_STATE, CARD_TYPE, GUARDIANS, ITEMS} from "../../data/cards";
import {GLOBAL_VARS} from "../../App";
import {LOCATION_LEVEL, LOCATION_STATE, LOCATIONS} from "../../data/locations";

/* INITIAL PLAYER STATE */
export function getInitialPlayerStates() {

Однако сейчас Express не загружается из-за этой ошибки:

> lore_hunters@0.1.0 start C:\Projects\lore_hunters
> node src/server/server.js

C:\Projects\lore_hunters\src\components\functions\InitialStateFunctions.js:1
import {shuffleArray} from "./CardManipulationFuntions";
^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1063:16)
    at Module._compile (internal/modules/cjs/loader.js:1111:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)
    at Module.load (internal/modules/cjs/loader.js:996:32)
    at Function.Module._load (internal/modules/cjs/loader.js:896:14)
    at Module.require (internal/modules/cjs/loader.js:1036:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (C:\Projects\lore_hunters\src\server\server.js:11:32)
    at Module._compile (internal/modules/cjs/loader.js:1147:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! lore_hunters@0.1.0 start: `node src/server/server.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the lore_hunters@0.1.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

Я бы хотел сохранить использование модулей импорта / экспорта в InitialStatesFunction - как тогда импортировать функцию getInitialPlayerState на сервер. js приложение ? Нужно ли как-то превращать сервер. js в модуль? («Невозможно использовать оператор импорта вне модуля»)

РЕДАКТИРОВАТЬ: я понимаю, что Node изначально не использует import и должен использоваться require. Проблема в том, что загруженный модуль возвратил ошибку, указанную в моем вопросе.

EDIT2: При использовании опции «type»: «module» для более новой версии Node я могу переписать сервер. * Для файла 1043 * для импорта вместо использования требуется:

import express from "express";
import http from "http"
import socketIO from "socket.io"
import path from "path"
import {getInitialPlayerStates} from "../components/functions/InitialStateFunctions";

const port = process.env.PORT || 4001;
const app = express();
// server instance
const server = http.createServer(app);

const playerStates = getInitialPlayerStates();

Однако при этом возникает следующая ошибка:

(node:12816) ExperimentalWarning: The ESM module loader is experimental.
internal/modules/esm/resolve.js:61
  let url = moduleWrapResolve(specifier, parentURL);
            ^

Error: Cannot find module C:\Projects\lore_hunters\src\components\functions\InitialStateFunctions imported from C:\Projects\lore_hunters\src\server\server.js
    at Loader.defaultResolve [as _resolve] (internal/modules/esm/resolve.js:61:13)
    at Loader.resolve (internal/modules/esm/loader.js:85:40)
    at Loader.getModuleJob (internal/modules/esm/loader.js:191:28)
    at ModuleWrap.<anonymous> (internal/modules/esm/module_job.js:42:40)
    at link (internal/modules/esm/module_job.js:41:36) {
  code: 'ERR_MODULE_NOT_FOUND'
}

Путь, указанный в выходных данных, кажется правильным. Структура папок выглядит следующим образом:

project file structure

РЕДАКТИРОВАТЬ: кажется, что для импорта должно быть указано расширение файла (https://medium.com/@nodejs / announce-core- node-js -support-for-ecmascript-modules-c5d6dc29b663 ) - это было легко исправить, однако тогда на сервере возникла проблема с JSX:

        effectsText: <Coin/>,
                     ^
SyntaxError: Unexpected token '<'

1 Ответ

1 голос
/ 23 марта 2020

Добавьте «type»: «module» в пакет. json в проекте сервера, если вам нужно использовать модули es6 в узле. при этом все файлы. js и .m js интерпретируются как модули ES. Вы можете интерпретировать отдельные файлы как Общие JS, используя расширение. cjs.

РЕДАКТИРОВАТЬ: имейте в виду, что невозможно смешивать импорт с require - если файл распознается как модуль Все требования должны быть изменены на импорт. Также должно быть указано расширение файла и нельзя использовать __dirname - см. https://medium.com/@nodejs / announce-core- node-js -support-for-ecmascript-modules-c5d6dc29b663 .

...