我的问题是,当我在代码中放置debugger;
语句时,如果我从终端使用npm run start:debug
启动NestJS应用程序,调试器将暂停在相应的.ts
文件中,但如果我从docker-compose.yml
启动服务器,调试器将暂停在构建的.js
文件中,而不是.ts
文件中。
为了重现一个最小的示例,我从docs启动了一个新的NestJS项目
git clone https://github.com/nestjs/typescript-starter.git projet
cd project
npm run install
然后,我添加了下面的.vscode/launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach NestJS",
"port": 9229,
"restart": true,
"stopOnEntry": false,
"protocol": "inspector",
"sourceMaps": true
}
]
}
我已将app.service.ts
更新为以下内容(我已添加debugger;
)
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
getHello(): string {
debugger;
return 'Hello World!';
}
}
如果我运行npm run start:debug
,用我的AttachNestJS
配置附加调试器,然后转到http://localhost:3000/,调试器将在src/app.service.ts
停止。
如果我创建一个Dockerfile
FROM node:14.18-alpine
WORKDIR /usr/src/app
COPY package-lock.json package.json ./
RUN npm install
COPY . .
一个docker-compose.yml
version: '3.7'
services:
api:
build:
context: .
dockerfile: Dockerfile
command: npm run start:debug:docker
volumes:
- ./:/usr/src/app
ports:
- '8000:3000'
- '9229:9229'
一个1 m14n1x
node_modules
.git
dist
并更新脚本中的debug start命令,以便调试器将绑定到容器
"start:debug": "nest start --debug --watch",
"start:debug:docker": "nest start --debug 0.0.0.0:9229 --watch",
然后运行docker-compose up --build
,服务器启动,我可以附加调试器,如果我转到http://localhost:8000/,调试器不会在src/app.service.ts
中停止,而是在app.service.js
中停止。
请注意,我需要在文件中显式地写入debugger;
,以便它停止,设置断点将导致“未绑定断点”。
由于当服务器在docker外部运行时调试器正确地停止在.ts
文件中,我不认为我的typescript配置有问题,它是在克隆NestJS repo后开箱即用的配置。
我已为此问题创建了一个repo。
提前感谢您的帮助
1条答案
按热度按时间tcomlyy61#
我偶然发现了这个youtube video,它显示了我的问题的解决方案。
关键是在
launch.json
中的配置中添加"remoteRoot": "/usr/src/app",
,/usr/src/app
是dockerfile中WORKDIR /usr/src/app
旁边的内容