Отладка TypeScript Node.js Ошибка компиляции - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь настроить среду отладки для проекта 2019, поэтому я добавил следующий скрипт в мой package.json

"dev:debug": "tsc-watch --onFirstSuccess \"node --inspect -r ts-node/register src/app.ts\"",

При его запуске я получу следующее

> node-api-starter@1.0.0 start:dev D:\p\my-project
> tsc-watch --onFirstSuccess "node --inspect -r ts-node/register src/app.ts"

7:18:10 AM - Starting compilation in watch mode... 


7:18:27 AM - Found 0 errors. Watching for file changes.
Debugger listening on ws://127.0.0.1:9229/b9a130c4-473d-4b55-a512-50ae9cff15a3
For help, see: https://nodejs.org/en/docs/inspector
D:\p\my-project\node_modules\ts-node\src\index.ts:423
    return new TSError(diagnosticText, diagnosticCodes)
           ^
TSError: ⨯ Unable to compile TypeScript:
src/api/auth/auth.controller.ts:580:29 - error TS2339: Property 'auth' does not exist on type 'Request<ParamsDictionary>'.

580     user.refreshToken = req.auth.refreshToken; 
                                ~~~~
src/api/auth/auth.controller.ts:581:23 - error TS2339: Property 'user' does not exist on type 'Request<ParamsDictionary>'.

581     user.userId = req.user.id;
                          ~~~~
src/api/auth/auth.controller.ts:617:82 - error TS2339: Property 'auth' does not exist on type 'Request<ParamsDictionary>'.

617     const user = await userService.getUserInfoByCustomColumn("refreshToken", req.auth.refreshToken);

                                  ~~~~
src/api/auth/auth.controller.ts:782:76 - error TS2339: Property 'user' does not exist on type 'Request<ParamsDictionary>'.

782     const user = await userService.getUserInfoByCustomColumn("userId", req.user.id, true);        

                            ~~~~
src/api/auth/auth.controller.ts:800:46 - error TS2339: Property 'user' does not exist on type 'Request<ParamsDictionary>'.

800     await userService.updateUserPassword(req.user.id, insertedNewPassword);
                                                 ~~~~

    at createTSError (D:\p\my-project\node_modules\ts-node\src\index.ts:423:12)
    at reportTSError (D:\p\my-project\node_modules\ts-node\src\index.ts:427:19)
    at getOutput (D:\p\my-project\node_modules\ts-node\src\index.ts:554:36)
    at Object.compile (D:\p\my-project\node_modules\ts-node\src\index.ts:760:32)
    at Module.m._compile (D:\p\my-project\node_modules\ts-node\src\index.ts:839:43)
    at Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Object.require.extensions.(anonymous function) [as .ts] (D:\p\my-project\node_modules\ts-node\src\index.ts:842:12)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)

Пример одной ошибки

auth.controller.ts - Line 577

const refresh = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const user = new User();
    user.refreshToken = req.auth.refreshToken;
    ...
}

Request, являющейся частью Express библиотеки

    interface Request<P extends core.Params = core.ParamsDictionary> extends core.Request<P> { }

Есть 2 файла, которые объявляют Express пространство имен и экспортируют Request интерфейсы с различными вариациями (см. ниже)

request.d.ts

declare namespace Express {
  export interface Request {
    user?: any;
    auth?: any;
  }
}

declarations.d.ts

declare module 'draftjs-to-html';

declare namespace Express {
  export interface Request {
    availableCountries: number[];
    language: string;
    pagination: {
      pageSize: number;
      pageNumber: number;
    };
  }
}

Так что здесь происходит, что первая компиляция с использованием tsc-watch выполняется успешно, но затем появляются некоторые ошибки в проекте.

  • Означает ли это, что ts-node пытается перекомпилировать?
  • Если так, то почему это не получается? он компилируется с конфигурацией, отличной от tsc-watch?
  • Есть ли флаг, который я мог бы использовать, чтобы пропустить проверку этих ошибок

1 Ответ

0 голосов
/ 30 апреля 2020

Во-первых, ts-node восстанавливает ваши источники, поэтому вы выполняете работу по компиляции дважды. Не уверен, что проблема вызвана этим, возможно, ts-node не может найти ваше tsconfig.

. В качестве немедленного решения я бы предложил объединение существующего объявления express.Request Что бы это ни было в вашем случае, с вашим собственным. По сути, вы помещаете эту декларацию из request.d.ts где-то в вашем исходном коде, где она доступна для функций вашего контроллера, и обновляете ее при необходимости соответствующими типами (или переходите с any):

declare global {
    export namespace Express {
        export interface Request {
            user?: any;
            auth?: {refreshToken: string};
        }
    }
}

Сейчас Request спортивный правильно набранный refreshToken.

...