javascript - net.connect 上的 EPIPE 到 HTTP 服务器

标签 javascript node.js express read-eval-print-loop

我正在尝试使用 roder 中的 net.connect 连接到 Node http 服务器套接字(expressJs),以将该套接字传递给我的 repl,以便能够基本上连接到我的 http 服务器并启动命令。

尝试此操作时,我在启动 repl 时收到错误 EPIPE。

这里是 repl 的代码:

const args = process.argv.slice(2);
if (args.length < 1) {
  process.exit(1);
}

const url = args[0];
const [host, port] = url.split(':');

//this will get the url to connect to
const socket = net.connect(parseInt(port), host);

process.stdin.pipe(socket);
socket.pipe(process.stdout);

Console.start({
  expose: { container, Metric:metricsObject},
  socket:socket
});

启动函数:

start(options = {}) {
    const { expose, socket } = options;
    const repl = REPL.start({
        eval: promisableEval,
        terminal:true,
        input: socket,
        output: socket,
    });

    Object.assign(repl.context, expose);
}

正在运行的http服务器:

const http = this.express
    .listen(this.config.web.port, () => {
      const { port } = http.address();
      this.logger.info(`[p ${process.pid}] Listening at port ${port}`);
      resolve();
    });

this.express 只是express的一个实例:this.express = express();

最佳答案

您似乎正在尝试通过类似 http://mine.example.com:3000/path/item 的 URL 连接到 http(或 https?)服务器通过说

net.connect(parseInt('3000/path/item'), 'http://mine.example.com');

由于多种原因,它不起作用。

  1. 除非您是 http 协议(protocol)方面非常优秀的程序员专家,否则您不应该使用 net.connect与 http 服务器对话。尝试使用http.clientRequest相反。

  2. 传递给 net.connect 的主机名应该是原始机器名称,例如 'mine.example.com'并且前面没有协议(protocol)说明符。

  3. 端口,类似。

抱歉,我不明白你想用标准输入和标准输出做什么。但是你的socket在其连接操作完成并且您收到一个事件宣布该情况之前,将无法使用。

您可以使用旧的 telnet连接到 http 服务器的程序。它允许您向服务器输入内容,然后显示您返回的内容。在你的情况下你会这样做

 telnet localhost 3000  # from shell your command line

服务器然后连接并坐在那里等待。您输入

 GET / HTTPS/1.0

然后两个 <Enter> s。然后,如果您输入 http://localhost:3000,服务器就会发回它会发送的任何内容。进入浏览器位置行。 然后关闭连接。

我不确定 http 协议(protocol)操作如何适合您的 REPL。

您在 https://medium.com/trabe/mastering-the-node-js-repl-part-3-c0374be0d1bf 提到的示例不连接到http服务器,它连接到tcp服务器。 Http 服务器(包括所有 Node/Express 服务器)是 tcp 服务器的一个亚种,但它们将 http 协议(protocol)分层在 tcp 协议(protocol)之上。 http 协议(protocol)不适合 REPL 的来回对话风格。

关于javascript - net.connect 上的 EPIPE 到 HTTP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59230061/

相关文章:

javascript - nodejs 向子进程发送信号不起作用

javascript - 使用 Express-Validator 时如何向客户端返回 Multer 错误?

javascript - 如何使用正则表达式查看字符串是否部分(或完全)匹配另一个字符串?

javascript - 当数据库中有\n 时,在浏览器中显示新行 <br>

node.js - Node JS : Sendgrid Mail 403 'Forbidden' error

mongodb - Express.js/Passport.js : Where is req. 用户存储?

css - 浏览 css 和 javascript 文件的缓存?

javascript - 将内容从 div 复制到 HTML 中的文本区域

javascript - 使用 jquery 查找 html 标签号

node.js - 如何将 json Web token 的 header 发送到服务器