在我的Web应用的服务器目录中(在TypeScript中),我有一个nodemon
命令(在更改后重新运行代码),如下所示:nodemon dist/index.js
但是,现在运行它会抛出以下错误:
/path/to/app/server/src/entities/Post.ts:1
import { Field, Int, ObjectType } from "type-graphql";
^^^^^^
SyntaxError: Cannot use import statement outside a module
从我在这里读到的内容来看,这个错误的原因通常是Node.js默认情况下需要CommonJS语法(例如,在this question中)。
"target": "es2017",
"module": "commonjs",
"moduleResolution": "node",
"lib": ["dom", "es6", "es2017", "esnext.asynciterable"],
"skipLibCheck": true,
(In未指定我的package.json
、"type"
。)
在tsconfig.json
中,"module"
被指定为"commonjs"
,看起来tsc
编译JavaScript是正确的,运行tsc
没有给我任何错误,而/dist
中的同一个文件使用exports
语法(例如Object.defineProperty(exports, "__esModule", { value: true });
),这是正确的CommonJS语法,对吗?
对ts-node
运行相同的nodemon
命令不会返回任何错误:nodemon --exec ts-node src/index.ts
有趣的是,我只是在/server
中初始化Docker构建后才开始收到此错误,如下所示:docker build -t [username]/[project]:[version] .
任何试图让Node使用ES的尝试(在package.json
中设置"type": "module"
和更改"module"
似乎只会带来更多的错误。(我重新生成/dist
是为了确保它不是由旧的编译文件引起的。)
版本:
- 一个月二十三个月一个月:一个月二十四个月一个月
- 一个月二十五日一个月:一个月二十六日一个月
- 一个月二十七个月一个月:一个月二十八个月一个月
我到底做错了什么?
任何帮助将不胜感激!
1条答案
按热度按时间4dbbbstv1#
嗯,我会做一个有根据的猜测,奇怪的是,从你的错误中,你看起来有
/path/to/app/server/src/entities/Post.ts
(注意ts扩展名和路径来自src而不是dist),但您运行的是dist中的js文件。从技术上讲,您应该只看到导入的.js文件。我怀疑您不知何故错误地导入了src/entities/Post.ts。例如,你可以沿着../src/entities/Post.ts
的路线做一些事情,这将打破dist并使其进入src。无论如何,关键是不知何故,你是从src而不是dist导入Post.ts。这也解释了为什么从ts-node运行可以工作,而从./dist/index.js运行不行。如果不清楚下一步应该做什么,请随时在这里留下评论,这样我可以帮助您进一步调试。