Каков правильный тип для суперагента, вводимого Angular DI? - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь внедрить Superagent в приложение node.js, которое использует Angular DI (ngx).

import * as request from 'superagent';
 ... 
 {
    provide: request,
    useFactory: () =>
      request.agent()
        .timeout({deadline: 10000, timeout: 60000}),
  },

Но я получаю property тайм-аут does not exist on SuperAgent<SuperAgentRequest>. Я пытался следовать этим документам , но SuperAgent, похоже, не является правильным типом. Тип request.agent() должен быть request.Request.

Чего мне не хватает? Как правильно предоставить request.Request, чтобы я мог настроить его глобально, чтобы использовать тот же (внедренный) экземпляр?

1 Ответ

0 голосов
/ 15 мая 2018

Как можно видеть в типах Superagent, request.agent() возвращает SuperAgent<SuperAgentRequest>, у которого нет timeout метода , это то, что говорит сообщение об ошибке.

Хотя *Метод 1008 * существует в типе Request, который является обещанием ответа.Это причина, почему эта ошибка была выброшена.Там нет запроса и нет ответа. Вспомогательная документация предоставляет пример для timeout:

request
  .get('/big-file?network=slow')
  .timeout({
    response: 5000,  // Wait 5 seconds for the server to start sending,
    deadline: 60000, // but allow 1 minute for the file to finish loading.
  })

В документации говорится, что в экземпляре агента есть методы, которые устанавливают значения по умолчанию , поэтому наборы отсутствуют.Нет deadline метода, и он не имеет смысла с timeout, потому что это время ожидания крайнего срока.

superagent типирования должны быть локально увеличены или улучшены и переданы в репозиторий DefiniteTyped,или исправлено на месте:

 {
    provide: request,
    useFactory: () =>
      <SuperAgent<SuperAgentRequest>>request.agent()
        ['timeout'](30)
  }

Я ожидаю, что расширенные наборы будут выглядеть примерно так (обработан оригинальный интерфейс Request с регулярным выражением):

custom.d.ts

import * as request from 'superagent';

type CallbackHandler = (err: any, res: request.Response) => void;
type Serializer = (obj: any) => string;
type BrowserParser = (str: string) => any;
type NodeParser = (res: request.Response, callback: (err: Error | null, body: any) => void) => void;
type Parser = BrowserParser | NodeParser;

declare module "superagent" {
    interface ConfigurableSuperAgent<Req extends request.SuperAgentRequest> extends request.SuperAgent<Req> {
        accept(type: string): this;
        auth(user: string, name: string): this;
        buffer(val?: boolean): this;
        ca(cert: Buffer): this;
        cert(cert: Buffer | string): this;
        key(cert: Buffer | string): this;
        ok(callback: (res: Response) => boolean): this;
        on(name: 'error', handler: (err: any) => void): this;
        on(name: 'progress', handler: (event: ProgressEvent) => void): this;
        on(name: string, handler: (event: any) => void): this;
        parse(parser: Parser): this;
        pfx(cert: Buffer | string): this;
        query(val: object | string): this;
        redirects(n: number): this;
        retry(count?: number, callback?: CallbackHandler): this;
        serialize(serializer: Serializer): this;
        set(field: object): this;
        set(field: string, val: string): this;
        timeout(ms: number | { deadline?: number, response?: number }): this;
        type(val: string): this;
        use(fn: Plugin): this;
    }

    interface SuperAgentStatic extends request.SuperAgent<request.SuperAgentRequest> {
        agent(): ConfigurableSuperAgent<request.SuperAgentRequest>;
    }
}
...