Я пытаюсь изучить 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. я вставил
@Evert Вот, я отредактировал это в своем посте.
Основная идея машинописного текста заключается в том, что у вас есть «исходный» и «целевой» каталоги. В вашем случае это «сборка», tsc
компилирует все, но когда вы запускаете свой код с помощью node
, вы используете только код в своем каталоге «сборки». Вы делаете это?
Вам также может понадобиться опция allowJs
, если вы используете смешанный javascript и машинописный текст.
Файл 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, не могли бы проверить?
Мне удалось исправить проблему. Это произошло благодаря как @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"]
}
Поделитесь своим tsconfig.json