Pay*_*ian 9 node.js typescript jestjs ts-jest
我正在尝试在 Jest 测试期间使用顶级等待,但 Jest 抱怨说
\nerror TS1378: Top-level \'await\' expressions are only allowed when the \'module\' option is set to \'es2022\', \'esnext\', \'system\', or \'nodenext\', and the \'target\' option is set to \'es2017\' or higher.\nRun Code Online (Sandbox Code Playgroud)\n这是有问题的文件 ( src/lib/mongodb.ts):
import { MongoClient } from \'mongodb\';\nimport mongoUri from \'mongo-uri-tool\';\nimport { getMongoURI } from \'./settings/settings.js\';\n\nconst getConnectionOptions = () => {\n const uri = getMongoURI();\n\n return {\n uri,\n parsedUri: mongoUri.parseUri(uri),\n };\n};\n\nconst connectToMongoDB = async () => {\n const connectionOptions = getConnectionOptions();\n\n const mongodb = await MongoClient.connect(connectionOptions.uri);\n\n return mongodb.db(connectionOptions.parsedUri.db);\n};\n\nexport const MongoDB = await connectToMongoDB();\nRun Code Online (Sandbox Code Playgroud)\n这是src/api/trips/trips.test.ts最终导入上述内容的测试()文件:
import { Trips } from \'./index\'; // <--------- this is the import which leads to importing mongodb\nimport generateId from \'../../lib/generateId\';\n\ndescribe(\'find trip by id\', () => {\n test(\'find trip by id\', async () => {\n const id = generateId();\n const slug = \'lol\';\n await Trips.insertOne({ _id: id, slug });\n\n const trip = await Trips.findOne({ _id: id });\n expect(trip._id).toStrictEqual(id);\n });\n});\nRun Code Online (Sandbox Code Playgroud)\n当我运行时npx tsc没有报告任何问题:
11:12AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing \xe2\x9c\xad \xe2\x9c\xb1 \xe2\x9e\x9c \xe2\x97\xbc\n \xe2\x9d\xae\xe2\x9d\xae\xe2\x9d\xae npx tsc\n11:12AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing \xe2\x9c\xad \xe2\x9c\xb1 \xe2\x9e\x9c \xe2\x97\xbc\nRun Code Online (Sandbox Code Playgroud)\n这是我的tsconfig.json,其中包含正确的module和target:
{\n "compilerOptions": {\n "sourceMap": true,\n "esModuleInterop": true,\n "allowJs": true,\n "noImplicitAny": true,\n "moduleResolution": "node",\n "lib": ["es2022", "DOM"],\n "module": "es2022",\n "target": "es2017",\n "rootDir": "src",\n "baseUrl": ".",\n "paths": {\n "*": ["node_modules/*", "src/types/*"]\n },\n "types": ["node", "jest"],\n "typeRoots": ["node_modules/@types", "src/types"],\n "outDir": "./built"\n },\n "include": ["./src/**/*", "jest.config.js"],\n "exclude": ["node_modules", "dist"]\n }\nRun Code Online (Sandbox Code Playgroud)\n这是我的jest.config.cjs:
const { jsWithTsESM: tsjPreset } = require("ts-jest/presets");\n\nmodule.exports = {\n ...tsjPreset,\n globals: {\n "ts-jest": {\n tsconfig: "tsconfig.json",\n }\n },\n testEnvironment: \'node\',\n moduleFileExtensions: ["ts", "js"],\n testRegex: ".*.test.ts"\n};\nRun Code Online (Sandbox Code Playgroud)\n这是我的项目结构:
\n\n为什么 Jest 和 ts-jest 抱怨我无法使用顶级等待,但tsc我的 IDE (Webstorm) 根本不抱怨?如何正确配置 Jest 和 ts-jest 以允许对 JS 和 TS 文件使用 ESM 进行顶级等待(我正在慢慢从 JS 迁移到 TS)?
请注意,Jest 工作得很好,直到我添加了第一个依赖于顶级等待的测试。看来我已经正确配置了 Jest 和 ts-jest 来与 ESM 以及 JS 和 TS 文件的混合一起使用。新的问题是用 ts-jest 找出顶层的等待。
\n编辑:如果我添加@ts-ignore到有问题的顶级等待,我会收到 Jest 报告的另一个类似问题:
// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nexport const MongoDB = await connectToMongoDB();\nRun Code Online (Sandbox Code Playgroud)\n Details:\n\n /Users/paymahn/code/tripvector/tripvector-mono/backend/src/lib/mongodb.ts:24\n exports.MongoDB = await connectToMongoDB();\n ^^^^^\n\n SyntaxError: await is only valid in async functions and the top level bodies of modules\nRun Code Online (Sandbox Code Playgroud)\n这可能是我使用的节点版本的问题吗?我目前使用的是 v17:
\n11:53AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing \xe2\x9c\xad \xe2\x9c\xb1 \xe2\x9e\x9c \xe2\x97\xbc\n \xe2\x9d\xaf\xe2\x9d\xaf\xe2\x9d\xaf node --version\nv17.6.0\n11:53AM /Users/paymahn/code/tripvector/tripvector-mono/backend testing \xe2\x9c\xad \xe2\x9c\xb1 \xe2\x9e\x9c \xe2\x97\xbc\n \xe2\x9d\xaf\xe2\x9d\xaf\xe2\x9d\xaf npm --version\n7.6.0\nRun Code Online (Sandbox Code Playgroud)\n编辑:有趣的是,我迁移到摩卡并-n loader=ts-node/esm完美地执行摩卡。我想知道笑话是怎么回事...