【问题标题】:extending http.IncomingMessage and http.ServerResponse & providing it to the http.createServer . How to do that in TS?扩展 http.IncomingMessage 和 http.ServerResponse 并将其提供给 http.createServer 。如何在 TS 中做到这一点?
【发布时间】:2022-10-04 17:06:47
【问题描述】:

我想为 http.createServer(opt,fn) 提供我自己的自定义 http.IncomingMessagehttp.ServerResponse 类。 我一直在寻找大约 2 小时来在 typescript 中找到解决方法。但这没有帮助。但是同样的代码也适用于 JS 。请帮我 。 我只想为 http.createServer() 提供一个自定义请求和响应对象。

这是我的服务器.jsJAVASCRIPT 文件。

const { createServer, IncomingMessage, ServerResponse } = require("http");

class Request extends IncomingMessage {
  constructor(socket) {
    super(socket);
  }

  getMeAnything() {
    return "you got REQUEST";
  }
}

class Response extends ServerResponse {
  constructor(req) {
    super(req);
  }

  getMeAnything() {
    return "you got  RESPONSE";
  }
}

const server = createServer(
  {
    IncomingMessage: Request,
    ServerResponse: Response,
  },
  (req, res) => {
    console.log(req.getMeAnything());

    res.end("Hello How are you ?");
  }
);

server.listen(3000);

这是我的服务器.ts打字稿文件:

import { Socket } from "net";
import { createServer, IncomingMessage, ServerResponse } from "http";

class Req extends IncomingMessage {
  constructor(socket: Socket) {
    super(socket);
  }

  getMeAnything() {
    return "you got anything inside REQUEST";
  }
}

class Res extends ServerResponse {
  constructor(req: IncomingMessage) {
    super(req);
  }

  getMeAnything() {
    return "you got anything inside RESPONSE";
  }
}

const server = createServer(
  {
    IncomingMessage: Req,
    ServerResponse: Res,
  },
  (req: Req, res: Res) => {
  
    // here I get a big fat error . Some suggested me to write @ts-ignore . But I think there is a solution for it . 
    
    console.log(req.getMeAnything());

    res.end("Hello How are you ?");
  }
);

server.listen(3000);

【问题讨论】:

    标签: javascript node.js typescript typescript-typings nodejs-server


    【解决方案1】:

    ServerResponse 的 TypeScript 扩展应定义如下:

    import {IncomingMessage, ServerResponse} from "http";
    
    export class Response<Request extends IncomingMessage = IncomingMessage> extends ServerResponse<Request> {
      redirect(url) {
        this.writeHead(301, {Location: url}).end();
      }
    }

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2017-06-02
      • 2011-06-11
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多