我们的应用程序是用TypeScript编写的,并使用Docker,为了避免通过.js文件进行往返,我们使用ts-node运行它直接加载.ts文件.
不幸的是,这似乎使VSCode对于有效的代码行设置断点的位置感到困惑.
此问题通过以下设置显示:
{
"scripts": {
"start": "node --inspect=0.0.0.0 --require ts-node/register src/index.ts"
},
"dependencies": {
"@types/node": "^10.1.2",
"ts-node": "^6.0.3",
"typescript": "^2.8.3"
}
}
Run Code Online (Sandbox Code Playgroud)
{
"compilerOptions": {
"target": "ES2017",
"module": "commonjs",
"outDir": "./dist",
"rootDir": "./src",
"esModuleInterop": true
}
}
Run Code Online (Sandbox Code Playgroud)
FROM node
RUN mkdir /home/node/app
WORKDIR /home/node/app
COPY package.json /home/node/app
RUN npm install && npm cache clean --force
COPY . /home/node/app
CMD [ "npm", "start" ]
Run Code Online (Sandbox Code Playgroud)
version: "3.4"
services:
http:
build: .
ports:
- "8000:8000" …Run Code Online (Sandbox Code Playgroud) remote-debugging typescript docker visual-studio-code ts-node
注意:我知道以下问题是关于实验性功能的。我在 ts-node 讨论论坛上创建了一个克隆。不过,我相信 StackOverflow 拥有更广泛的曝光度,并且会在更短的时间内找到解决方案。
\n我正在尝试制作一个简单的脚本,从一个位置读取文件并处理它。这是我到目前为止所得到的,遵循#1007:
\n节点:v12.22.1
\nmy-app\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .eslintrc.cjs\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .gitignore\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 in\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 given.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 node_modules\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 out\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package-lock.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 helper.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.ts\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\nRun Code Online (Sandbox Code Playgroud)\n包.json
\nmy-app\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .eslintrc.cjs\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .gitignore\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 in\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 given.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 node_modules\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 out\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package-lock.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 helper.ts\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.ts\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\nRun Code Online (Sandbox Code Playgroud)\ntsconfig.json
\n{\n "compilerOptions": {\n "target": "es5", /* Specify ECMAScript target version: \'ES3\' (default), \'ES5\', \'ES2015\', \'ES2016\', \'ES2017\', \'ES2018\', \'ES2019\', \'ES2020\', or \'ESNEXT\'. */\n "module": "ESNext", /* Specify module code …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用ts-node运行以下代码.
import { writeFileSync, readFileSync } from 'fs';
Run Code Online (Sandbox Code Playgroud)
但是我得到:
src/main/ts/create.ts (1,45): Cannot find module 'fs'. (2307)
Run Code Online (Sandbox Code Playgroud)
我需要做什么来允许typescript导入fs模块?
成功编译了我的TypeScript项目之后,我打算在VS Code的调试模式下运行它ts-node.问题是,ts-node找不到d.ts我创建的文件(虽然tsc它没有问题).
项目结构是:
/
conf/
dist/
src/
types/
package.json
tsconfig.json
Run Code Online (Sandbox Code Playgroud)
tsconfig.json 相关条目是:
{
"compilerOptions": {
"target": "es2017",
"module": "commonjs",
// "lib": [],
"sourceMap": true,
"outDir": "dist",
"rootDir": "src",
"moduleResolution": "node",
"baseUrl": ".",
"paths": {
"*": [
"node_modules/*",
"src/types/*"
]
},
// "rootDirs": [],
// "typeRoots": [],
// "types": [],
},
"include": [
"src/**/*"
]
}
Run Code Online (Sandbox Code Playgroud)
定义文件ts-node找不到的是src/types/global.d.ts:
import { App } from '../App';
declare global {
namespace NodeJS { …Run Code Online (Sandbox Code Playgroud) 我刚开始使用 ts-node。这是一个非常方便的工具。运行时间看起来很清楚。但它不适用于 CLI 解决方案。我无法将参数传递到编译的脚本中。
ts-node --preserve-symlinks src/cli.ts -- printer:A
Run Code Online (Sandbox Code Playgroud)
这是行不通的。我在寻求帮助。
我的项目一直ts-node用于运行 JavaScript 和 TypeScript 的混合。最近它停止工作,没有明显的原因。在最简单的层面上,这是它的运行方式和它产生的错误:
$ TS_NODE_PROJECT=./tsconfig.json ../../node_modules/.bin/ts-node app.js MSTR-1513
INFO | Arrow/1.6.0
No deployment manifest found
Uncaught Exception Could not find sourceFile: '/Users/jonah/Projects/myapp/server/src/v1/route/Routes.ts' in [].
Error: Could not find sourceFile: '/Users/jonah/Projects/myapp/server/src/v1/route/Routes.ts' in [].
at getValidSourceFile (/Users/jonah/Projects/myapp/node_modules/typescript/lib/typescript.js:122211:23)
at Object.getEmitOutput (/Users/jonah/Projects/myapp/node_modules/typescript/lib/typescript.js:122580:30)
at getOutput (/Users/jonah/Projects/myapp/node_modules/ts-node/src/index.ts:354:30)
at Object.compile (/Users/jonah/Projects/myapp/node_modules/ts-node/src/index.ts:395:32)
at Module.m._compile (/Users/jonah/Projects/myapp/node_modules/ts-node/src/index.ts:473:43)
at Module._extensions..js (module.js:663:10)
at Object.require.extensions.(anonymous function) [as .ts] (/Users/jonah/Projects/myapp/node_modules/ts-node/src/index.ts:476:12)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
Run Code Online (Sandbox Code Playgroud)
摘录app.js:
const Routes = require('./v1/route/Routes').default;
server.app.use('/v1', new Routes().router);
Run Code Online (Sandbox Code Playgroud)
我对错误的这一部分感到非常困惑: …
我正在尝试获取包含在 my 中的所有列entity,但我只能获取与其他实体没有任何关系的列。
我使用此代码块将所有行提取到此存储库。
private translationTextRepository = getRepository(TranslationText);
async all(request: Request, response: Response, next: NextFunction) {
return this.translationTextRepository.find();
}
Run Code Online (Sandbox Code Playgroud)
这entity是这个存储库的。
@Entity('TranslationText')
export class TranslationText {
@PrimaryGeneratedColumn()
ID: number;
@Column()
CreatedBy: string;
@Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
CreatedDate: Date;
@Column()
Status: boolean;
@Column({ nullable: true, default: null })
ModifiedBy: string;
@Column({ type: 'timestamp', nullable: true, default: null })
ModifiedDate: Date;
@Column()
Text: string;
@ManyToOne((type) => Locale, (locale) => locale.ID)
@JoinColumn({ name: 'LocaleID' })
LocaleID: …Run Code Online (Sandbox Code Playgroud) 我试图在项目中使用顶层,看到有必要将模块从 tscofnig 更改为 esnext 或 system,但由于某种原因我的 ts-node 错误。而且我已经把 type: module 我试图使用标志:--experimental-modules 但错误仍然不知道如何解决。
包.json:
{
"name": "micro-hr",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"type": "module",
"scripts": {
"commit": "git-cz",
"build": "babel src --extensions \".js,.ts\" --out-dir dist --copy-files --no-copy-ignored",
"start:dev": "ts-node-dev --experimental-modules --inspect --respawn --transpile-only --ignore-watch node_modules -r tsconfig-paths/register src/index.ts",
"start:debug": "node start --debug --watch",
"start:prod": "node dist/index.ts",
"test": "jest",
"lint": "eslint --fix",
"lint2": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js --config ./ormconfig.ts",
"migration:generate": "ts-node ./node_modules/typeorm/cli.js migration:generate -n"
},
"devDependencies": { …Run Code Online (Sandbox Code Playgroud) 我在TypeScript中有一个项目,它使用了我在计算机上无法访问的几个API(它们存在于Web上).代码将在本地编译良好,因为我在foo.d.ts文件中有所有API ,因此系统知道它们存在于某处.
但是,我想用NodeJS应用程序对代码的部分单元进行单元测试.我可以很好地将代码导入节点,但每当我到达从定义文件导入模块的代码时,我都会收到以下错误:
Error: Cannot find module 'messages'
at Function.Module._resolveFilename (module.js:527:15)
at Function.Module._load (module.js:476:23)
at Module.require (module.js:568:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (~/dev/repos/sample_typescript_fail/App.js:3:18)
at Module._compile (module.js:624:30)
at Object.Module._extensions..js (module.js:635:10)
at Module.load (module.js:545:32)
at tryModuleLoad (module.js:508:12)
at Function.Module._load (module.js:500:3)
...
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为该代码仅在本地定义,并且不存在.
我可以手动将模块注册到NodeJS,比如
Registry.register('messages', () => {...});
Run Code Online (Sandbox Code Playgroud)
这样我就可以用polyfill进行编译和测试?
package.json
{
"name": "sample_typescript_declare_issue",
"version": "1.0.0",
"description": "",
"main": "index.ts",
"scripts": {
"start": "ts-node index.ts"
},
"author": "",
"license": "MIT"
}
Run Code Online (Sandbox Code Playgroud)
index.ts
import {App} from "./App";
console.log("Starting program");
// How …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 CLI 中使用 ts-node 运行 typescript 脚本,这意味着我没有 package.json。
这是我尝试运行的命令:
npx -p typescript@latest -p ts-node@latest -p @types/node@latest ts-node -T --project scripts/tsconfig.script.json scripts/my-script.ts
Run Code Online (Sandbox Code Playgroud)
当我在脚本中使用相对路径时,它工作得非常好。
然后我尝试通过启用路径来增强它,tsconfig.script.json以便能够从它们导入。
我想使用tsconfig-paths。这是我尝试运行的命令:
npx -p typescript@latest -p ts-node@latest -p @types/node@latest -p tsconfig-paths@latest ts-node -T -r tsconfig-paths/register --project scripts/tsconfig.script.json scripts/my-script.ts
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
Error: Cannot find module 'tsconfig-paths/register'
Run Code Online (Sandbox Code Playgroud)
我尝试过调整参数的顺序ts-node以及添加/删除选项,但是,我仍然无法使其工作并查看包tsconfig-paths。
我错过了什么吗?
提前致谢
ts-node ×10
typescript ×8
node.js ×3
docker ×1
javascript ×1
module ×1
npx ×1
orm ×1
typeorm ×1