TypeScript中的Http请求

Abr*_*ain 23 node.js typescript

我试图将nodejs中的以下片段转换为typescript:如何在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()}`);
}
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试代码:

// 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);
});
Run Code Online (Sandbox Code Playgroud)

如果这工作正常(我检查了Firefox上的链接,并返回一个纯文本随机数)我应该得到一个纯文本数字.但是,当我console.log()回答时,我什么都没得到.我在这做错了什么?

Adr*_*ura 27

使用https://github.com/request/request-promise-native库.

安装:

npm install --save request
npm install --save request-promise-native
Run Code Online (Sandbox Code Playgroud)

然后在你的应用中:

import * as request from "request-promise-native";

(async () => {
  const baseUrl = 'www.random.org/integers';
  const queryString = '?num=100&min=1&max=100&col=5&base=10&format=html&rnd=new';
  var options = {
      uri: baseUrl + queryString,
  };

  const result = await request.get(options);
})()
Run Code Online (Sandbox Code Playgroud)

  • 自 2020 年 2 月 11 日起,请求已完全弃用。 (6认同)
  • `错误 TS1308:'await' 表达式只允许在异步函数中使用。` (2认同)
  • @xged是正确的,要使用异步/等待,您必须将代码包装在异步函数中。其他情况下,您必须编写例如request.get(options).then((result:string)=&gt; console.log(result)); 阿德里安(Adrian):当我在uri前面加上https时,它可以工作。没有可用的类型定义,是吗? (2认同)

Dan*_*ing 8

尽管request-promise-native可能工作得很好,但Axios是在 TypeScript 中使用的更好替代方法。它带有自己的类型定义,并且总体上较少依赖其他包。使用它的 API 很像 Adrian 提供的答案,但是有一些细微的差异。

const url: string = 'your-url.example';

try {
    const response = await axios.get(yourUrl);
} catch (exception) {
    process.stderr.write(`ERROR received from ${url}: ${exception}\n`);
}
Run Code Online (Sandbox Code Playgroud)

显然,如果您希望客户端处理异常,则可以省略 try/catch 语句。

  • 我同意你的这个观点。我一直在使用 axios,自从这个问题以来,我一直在许多项目中轻松地使用它。感谢您的建议。 (2认同)