javascript - Apa tipe yang tepat untuk superagent yang disuntikkan DI Angular?
Saya sedang mencoba menyuntikkan Superagent dalam aplikasi node.js yang menggunakan Angular DI (ngx).
import * as request from 'superagent';
...
{
provide: request,
useFactory: () =>
request.agent()
.timeout({deadline: 10000, timeout: 60000}),
},
Tapi saya mendapatkan propertytimeoutdoes not exist on SuperAgent<SuperAgentRequest>. Saya mencoba mengikuti dokumen ini tetapi SuperAgent sepertinya bukan tipe yang benar. Tipe dari request.agent() seharusnya request.Request.
Apa yang saya lewatkan? Bagaimana saya dapat memberikan request.Request dengan benar sehingga saya bisa mengkonfigurasinya secara global untuk menggunakan instance yang sama (yang disuntikkan)?
Jawaban #1
Seperti yang dapat dilihat dalam typings Superagent, request.agent() mengembalikan SuperAgent<SuperAgentRequest> yang tidak memiliki metode timeout, inilah yang dikatakan pesan kesalahan.
Meskipun metode timeout ada dalam tipe Request yang merupakan janji dari sebuah respons. Inilah alasan mengapa kesalahan ini dilempar. Tidak ada permintaan dan tidak ada respons. Dokumentasi Superagent menyediakan contoh untuk 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.
})
Dokumentasi menyatakan bahwa instance agen memiliki metode yang mengatur default, jadi tipe tidak lengkap. Tidak ada metode deadline, dan itu tidak masuk akal dengan timeout, karena ini adalah timeout deadline.
Typings superagent sebaiknya ditingkatkan secara lokal, atau diperbaiki dan diajukan PR ke repositori DefinitelyTyped, atau diperbaiki di tempat:
{
provide: request,
useFactory: () =>
<SuperAgent<SuperAgentRequest>>request.agent()
['timeout'](30)
}
Saya akan mengharapkan tipe yang diperluas menjadi sesuatu seperti (antarmuka Request asli yang diproses dengan ekspresi reguler):
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>;
}
}
