gpt4 book ai didi

node.js - 如何在 Node 中关闭标准输入?

转载 作者:搜寻专家 更新时间:2023-10-31 23:15:20 25 4
gpt4 key购买 nike

我正在学习 Node.js,我认为我有一个非常简单的脚本,但任何调整都不会让我的脚本永远挂起。

假设我有一个哑服务器在运行:

$ nc -l 32001 <<EOF
HTTP/1.1 200 OK
Content-Type: text/plain

Works
EOF

然后我运行以下脚本:

var http = require('http');
var options = {
hostname: 'localhost',
port: 32001,
method: 'POST',
headers: {'Content-Type': 'text/plain'}
};
var req = http.request(options, res => {
var exitCode = res.statusCode >= 200 && res.statusCode < 300 ? 0 : 1;
res.pipe(process.stdout).on('end', () => process.exit(exitCode));
});
req.on('error', error => console.error(error));
process.stdin.pipe(req)
.on('end', () => console.log('this does trigger'));

但是当我执行以下操作时:

$ echo foobar | node my-script.js

它只是挂起,永远不会到达请求回调。我希望请求流结束并调用 http.request 回调,然后输出 Works 并最终退出进程。

我检查过 end 事件确实是从 process.stdin.pipe() 调用的,我试图手动结束 req 流中的 end 回调。但它不会结束。如何通过管道将标准输入传输到 http.request 并让它结束流?

最佳答案

你走在正确的轨道上;您只需要将您的监听器附加到适当的对象事件。在第一种情况下(书面的,而不是执行的):

res.pipe(process.stdout).on('end', () => process.exit(exitCode));

您说的是:“将响应中的数据通过管道传输到 stdout,当 stdout 结束时,退出进程。”

您的意思是:“将数据从响应传输到标准输出。当响应 结束时,退出进程。”编码:

res.pipe(process.stdout);
res.on('end', () => process.exit(exitCode));

这里需要明确的一点是,除非您特别关闭 process.stdout,否则它将从不关闭/结束,直到您退出程序。但是,响应 将在 HTTP 交互完成时结束。

第二种情况类似:

process.stdin.pipe(req)
.on('end', () => console.log('this does trigger'));

您说的是:“将数据从标准输入传输到请求,当请求结束时,写一条消息。”

您的意思是:“将数据从 stdin 传送到请求。当 stdin 结束时,写一条消息。”编码:

process.stdin.pipe(req);
process.stdin.on('end', () => console.log('this does trigger'));

这里稍微有些细微差别,因为您可以监听 stdinend 事件或 requestfinish 事件:

process.stdin.pipe(req).on('finish', () => console.log('Request has finished writing/sending');
process.stdin.on('end', () => console.log('Stdin has no more data'));

为了完整起见,您的工作客户会回复您,并为假定的教学清晰度对文本进行一些温和的修改:

var http = require('http');
var options = {
hostname: 'localhost',
port: 32001,
method: 'POST',
headers: {'Content-Type': 'text/plain'}
};
var req = http.request(options, res => {
var exitCode = res.statusCode >= 200 && res.statusCode < 300 ? 0 : 1;
res.pipe(process.stdout);
res.on('end', () => {
console.log('Response (IncomingMessage) has no more data; exiting with code:', exitCode);
process.exit(exitCode);
});
});
req.on('error', error => console.error(error));
process.stdin.on('end', () => console.log('Stdin has no more data.'));
process.stdin.pipe(req).on('finish', () => console.log('Request has finished writing/sending'));

命令行输出:

$ echo Some text from stdin | node test.js; echo $?
Stdin has no more data.
Request has finished writing/sending
Works
Response (IncomingMessage) has no more data; exiting with code: 0
0

在“服务器”:

$ nc -l 32001 <<EOF
HTTP/1.1 200 OK
Content-Type: text/plain

Works
EOF
POST / HTTP/1.1
Content-Type: text/plain
Host: localhost:32001
Connection: close
Transfer-Encoding: chunked

15
Some text from stdin

0

关于node.js - 如何在 Node 中关闭标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48935076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com