Невозможно использовать оператор импорта вне модуля с помощью Express и Typescript, я глубоко запутался в модулях

Я пытаюсь изучить Typescript, но я зациклился на использовании модулей, импорта и экспорта при использовании Express. Во-первых, мой код (я сокращу ненужные части):

Полный код https://github.com/coldblade2000/BannerServer

Courses.js ("/courses обработчик маршрута для Express)

var express = require('express');
var router = express.Router();
const mongoose = require('mongoose')
const {CourseModel} = require('../MongoDB/models/models.ts')

const {Course} =  require('../model/Course.ts'); //<----ERROR HERE
//const {retrieveMultipleCourses} = require('../model/model.ts')

mongoose.connect('mongodb://localhost:27017/banner', {useNewUrlParser: true, useUnifiedTopology: true});
/* GET users listing. */
router.get('/', async function (req, res, next) {
    ...
});

function isEmpty(obj) {
    ...
}

module.exports = router;

Курс.ts

import * as mongoose from 'mongoose' //<----ERROR HERE: SyntaxError: Cannot use import statement outside a module
// const mongoose = require('mongoose')
export interface Course{
    ...
}

export class CourseClass implements Course{
    ...
}


export interface Professor{
    ...
}
export interface Meeting {
    ...
}
export interface Days{
    ...
}

Ошибка


> [email protected] start C:\Users\diego\Desktop\BannerServer
> node bin/www.js && nodemon app.js

C:\Users\diego\Desktop\BannerServer\model\Course.ts:1
    import * as mongoose from 'mongoose'
    ^^^^^^

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:979:16)
    at Module._compile (internal/modules/cjs/loader.js:1027:27)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (C:\Users\diego\Desktop\BannerServer\routes\courses.js:6:19)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (C:\Users\diego\Desktop\BannerServer\app.js:9:21)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)

Tsconfig.json

```{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "rootDir": "./",
    "outDir": "./build",
    "esModuleInterop": true,
    "strict": true
  }
}

пакет.json

{
  "name": "server",
  "version": "0.0.0",
  "private": true,
  "module": "CommonJS",
  "scripts": {
    "start": "node bin/www.js && nodemon app.js",
    "build": "tsc --project ./",
    "tsc": "tsc",
    "dev": "nodemon —exec babel-node app.js"
  },
  "dependencies": {
    "@typegoose/typegoose": "^7.4.1",
    "@types/node": "^14.14.1",
    "cookie-parser": "~1.4.4",
    "cors": "^2.8.5",
    "debug": "~2.6.9",
    "ejs": "~2.6.1",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "mongoose": "^5.10.4",
    "morgan": "~1.9.1"
  },
  "devDependencies": {
    "@babel/core": "^7.12.10",
    "@babel/node": "^7.12.10",
    "@babel/preset-env": "^7.12.11",
    "@types/mongoose": "^5.7.36",
    "nodemon": "^2.0.6",
    "ts-node": "^9.1.1",
    "typescript": "^4.1.3"
  }
}

Итак, проблема в том, что я получаю SyntaxError: Cannot use import statement outside a module, когда использую import * as mongoose from 'mongoose' в Course.ts. Я получаю ту же ошибку, если я меняю const Course = require('../model/Course.ts'); вcourses.js на import Course from ''.../model/Course.ts', но на этот раз в строке, которую я только что изменил. Даже когда я пытаюсь изменить Course.ts для использования module.exports, проблема сохраняется. Я в отчаянии, поэтому мне нужна помощь. Поскольку Express, похоже, не любит модули ES6, я не думаю, что могу просто поместить «type:module» в package.json. я вставил

Поделитесь своим tsconfig.json

Evert 22.12.2020 19:56

@Evert Вот, я отредактировал это в своем посте.

coldblade2000 22.12.2020 19:58

Основная идея машинописного текста заключается в том, что у вас есть «исходный» и «целевой» каталоги. В вашем случае это «сборка», tsc компилирует все, но когда вы запускаете свой код с помощью node, вы используете только код в своем каталоге «сборки». Вы делаете это?

Evert 22.12.2020 20:05

Вам также может понадобиться опция allowJs, если вы используете смешанный javascript и машинописный текст.

Evert 22.12.2020 20:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
6 052
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Файл TS не переносится в JS в папке сборки. поэтому, чтобы убедиться, что перейдите в файловую ванну в папке сборки, и вы увидите, что это все еще файл *.ts

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "baseUrl": "./",
    "outDir": "./build",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "sourceMap": true,
    "incremental": true
  },
  "exclude": ["node_modules", "build"]
}

Ставлю, но та же проблема осталась. Я думаю, что это может быть проблема с моим скриптом package.json. Я положил это в свой OP, не могли бы проверить?

coldblade2000 22.12.2020 21:57
Ответ принят как подходящий

Мне удалось исправить проблему. Это произошло благодаря как @Hegazy, так и @Evert.

Моя основная проблема, как указал @Evert, я изменил свой «стартовый» скрипт на первую компиляцию с использованием tsc, а также указал node, чтобы он указывал на /build/... вместо просто /....

Мой текущий package.json

{
  "name": "server",
  "version": "0.0.0",
  "private": true,
  "module": "CommonJS",
  "scripts": {
    "start": "tsc && node build/bin/www.js && nodemon app.js",
    "build": "tsc --project ./",
    "tsc": "tsc"
  },
  "dependencies": {
    "@typegoose/typegoose": "^7.4.1",
    "@types/node": "^14.14.1",
    "cookie-parser": "~1.4.4",
    "cors": "^2.8.5",
    "debug": "~2.6.9",
    "ejs": "~2.6.1",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "mongoose": "^5.10.4",
    "morgan": "~1.9.1"
  },
  "devDependencies": {
    "@types/mongoose": "^5.7.36",
    "@typescript-eslint/eslint-plugin": "^4.11.0",
    "@typescript-eslint/parser": "^4.11.0",
    "eslint": "^7.16.0",
    "nodemon": "^2.0.6",
    "ts-node": "^9.1.1",
    "typescript": "^4.1.3"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "baseUrl": "./",
    "outDir": "./build",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "skipLibCheck": true,
    "resolveJsonModule": true,
    "experimentalDecorators": true,
    "sourceMap": true,
    "allowJs": true,
    "incremental": true
  },
  "exclude": ["node_modules", "build"]
}

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