Ожидается, что запрошенный модуль ‘graphql’ будет иметь тип CommonJS

#javascript #node.js #graphql

#javascript #node.js #graphql

Вопрос:

Я запускаю свой сервис с:

"start": "NODE_ENV=production node --optimize_for_size --trace-warnings --experimental-json-modules --es-module-specifier-resolution=node --no-warnings dist/server-new/server.js"

package.json — обратите внимание, что это тип module

 {
    "name": "some-name",
    "license": "UNLICENSED",
    "version": "0.0.0",
    "description": "",
    "type": "module",
    "engines": {
        "node": "14.x",
        "npm": "6.14.x"
    },
...
}
  

tsconfig.json

 {
    "extends": "../../tsconfig",
    "compilerOptions": {
        "noEmit": false,
        "rootDir": "."           /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */,
        "outDir": "../../dist"  /* Redirect output structure to the directory. */
    },
    "module": "ESNext",
    "include": ["./*.ts", "package.json"],
    "resolveJsonModule": true
}
  

server.ts — импорт api.js в качестве модуля ES6

 import cluster from 'cluster';
import os from 'os';
import App from './api.js';

...
    App.listen(port, () => {
        console.log(`express is listening on port ${port}`);
    });
  

api.ts — способен импортировать express, но возникли проблемы с импортом общих JS-модулей GraphQL

 import compression from 'compression';
import express from 'express';
import { graphqlHTTP } from 'express-graphql';
import { buildSchema } from 'graphql';
import CompanyController from './Controllers/CompanyController';


const App = express()
    .use(compression())
    ....
    );
export default App;
  

Ошибка во время запуска скрипта:
SyntaxError: The requested module 'graphql' is expected to be of type CommonJS, which does not support named exports. CommonJS modules can be imported by importing the default export.

ссылаясь на import { buildSchema } from 'graphql';

Итак, я попробовал это:

 import * as graphQL from 'graphql';
const { buildSchema } = graphQL;
  

но затем я получаю здесь ошибку TS … возможно, мне нужно решить это сейчас, но не уверен, как:

TypeError: buildSchema is not a function

Также пробовал:

 // eslint-disable-next-line @typescript-eslint/no-var-requires
const { buildSchema } = require('graphql');
  

Ошибка: ReferenceError: require is not defined

Поэтому я не уверен, как в мире я буду импортировать эти два элемента здесь в api.ts.

Документы GraphQL

Ответ №1:

какая боль в заднице

 import pkg1 from 'express-graphql';

import pkg from 'graphql';

const { graphqlHTTP } = pkg1;

const { buildSchema } = pkg;
  

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

1. есть какие-нибудь идеи, почему это так? в документах указано, что он не нужен. (Я столкнулся с той же проблемой).

Ответ №2:

Выполните следующие действия и, если он все еще не работает, обновите версию вашего узла.

 import graphql from 'graphql';

const { buildSchema } = graphql; 
  

Ответ №3:

Получил это при запуске модулей ESM, ориентированных на ES2022 в Windows и Node 14.

Обновление до узла 16 устранило проблему.

Ответ №4:

Это происходит, когда версия узла вашего локального компьютера слишком старше, чем версия узла, используемая в вашем проекте (проверьте файл / ы packahe.json). используйте NVM (диспетчер версий узлов), чтобы использовать ту же версию узла, что и проект, или более высокую стабильную версию узла.