I'm trying to learn Typescript but I've gotten hung up on using modules, imports and exports while using Express. First, my code (I'll shorten irrelevant parts):
Full code https://github.com/coldblade2000/BannerServer
courses.js ( "/courses route handler for 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;
Course.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{
...
}
Error
> [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
}
}
package.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"
}
}
So the problem I have is that I get SyntaxError: Cannot use import statement outside a module when I use import * as mongoose from 'mongoose' in Course.ts. I get the same error if I change const Course = require('../model/Course.ts'); in courses.js to import Course from ''.../model/Course.ts', but this time in the line I just changed. Even when I try to change Course.ts to use module.exports, the problem persists. I am at my wits end, so I require help. Since Express doesn't seem to like ES6 modules, I don't think I can just put "type:module" in package.json. I put in
tsccompiles everyhing, but when you run your code withnode, you use only the code in your 'build' directory. Are you doing that?allowJsoption if you are doing mixed javascript and typescript.