我试图将nodejs中的以下代码片段转换为打字稿:如何在Nodejs中进行Http请求
这是我的TypeScript代码:
import * as http from 'http'; export class HttpRequest{ url: string; private path: string; private host: string; private args: Array<Array<string>>; constructor(url: string, args?: string){ this.url = url; this.processUrl(this.url); if(!!args){ this.processArgs(args); } this.args = []; } private processUrl(url: string): void { let tld: number = url.lastIndexOf('.') let sep: number = url.indexOf('/', tld); this.host = url.slice(0, sep); this.path = url.slice(sep+1); } private processArgs(args: string): void { let sep: number = args.indexOf('&'); if(sep < 0){ return ; } let argpair: string = args.slice(0, sep); let apsep: number = argpair.indexOf('='); let k: string = argpair.slice(0, apsep); let v: string = argpair.slice(apsep+1); this.args.push([k,v]); this.processArgs(args.slice(sep+1)); } private preparePath(): string { let path: string = `?`; this.args.forEach((arg: Array<string>, i: number): void => { let k: string = arg[0]; let v: string = arg[1]; path += k + '=' + v; if(i == this.args.length-1){ return ; } path += '&'; }); return path; } public addArg(key: string, value: string): void { try{ this.args.push([key,value]); } catch(err) { console.log(err); } } public addArgs(args: Array<Array<string>>): void { args.forEach((arg: Array<string>): void => { this.args.push(arg); }); } public get(cb: (res: any) => any): void { let opts = { 'host': this.host, 'path': `/${this.path}/${this.preparePath()}` }; http.request(opts, (r: http.IncomingMessage): void => { let data = ''; r.on('data', (chunk: string): void => { console.log('Got chunk: ' + chunk); data += chunk; }); r.on('end', (): void =>{ console.log('Response has ended'); console.log(data); cb(data); }); r.on('error', (err): void => { console.log('Following error occured during request:\n'); console.log(err); }) }).end(); } public test(): void { console.log(this.preparePath()); console.log(`/${this.path}/${this.preparePath()}`); } }
这是我的测试代码:
// Test httpRequest import { HttpRequest } from './httpRequest'; const request = new HttpRequest('www.random.org/integers'); request.addArg('num', '1'); request.addArg('min', '1'); request.addArg('max', '50'); request.addArg('col', '1'); request.addArg('base', '10'); request.addArg('format', 'plain'); request.addArg('rnd', 'new'); request.test(); request.get((res: string): void => { console.log('Response received: ' + res); });
如果此方法正常运行(我在Firefox上检查了链接,则返回纯文本随机数),我应该获得一个数字作为纯文本。但是,当我console.log()回应时,我什么也没得到。我在这里做错了什么?
console.log()
尽管request-promise- native可能工作得很好,但Axios是在TypeScript中使用的更好的替代方法。它带有自己的类型定义,总体上对其他程序包的依赖性较小。使用它的API很像Adrian提供的答案,但是有一些细微的差异。
request-promise- native
const url: string = 'your-url.example'; try { const response = await axios.get(yourUrl); } catch (exception) { process.stderr.write(`ERROR received from ${url}: ${exception}\n`); }
显然,如果您希望客户端处理异常,则可以省去try / catch语句。