You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bun.js中循环外读取单行用户输入及进程终止问题

在Bun.js循环外读取用户输入并解决进程无法终止问题

Bun.js有原生API支持循环读取用户输入,示例代码如下:

const prompt = "Type something: ";
process.stdout.write(prompt);
for await (const line of console) {
  console.log(`You typed: ${line}`);
  process.stdout.write(prompt);
}

但如果需要在循环外单次读取用户输入,可以通过process.stdin.iterator()实现:

const stdinIterator = process.stdin.iterator()

console.write('What is your first name?\n> ')
const firstName = (await stdinIterator.next()).value.toString().trimEnd()
console.log('Hello,', firstName)

console.write('What is your last name?\n> ')
const lastName = (await stdinIterator.next()).value.toString().trimEnd()
console.log('Welcome', `${firstName} ${lastName}`)

不过这段代码会导致进程无法自动终止,必须手动按下Ctrl+C结束。原因是stdin迭代器会保持事件循环处于活跃状态,阻止进程退出。

要解决这个问题,只需在读取完所有输入后,关闭stdin流或者直接终止进程:

方法1:关闭stdin流

const stdinIterator = process.stdin.iterator()

console.write('What is your first name?\n> ')
const firstName = (await stdinIterator.next()).value.toString().trimEnd()
console.log('Hello,', firstName)

console.write('What is your last name?\n> ')
const lastName = (await stdinIterator.next()).value.toString().trimEnd()
console.log('Welcome', `${firstName} ${lastName}`)

// 关闭stdin,允许进程自动终止
process.stdin.end()

方法2:直接终止进程

如果不需要等待其他异步任务执行,也可以直接调用process.exit():

const stdinIterator = process.stdin.iterator()

console.write('What is your first name?\n> ')
const firstName = (await stdinIterator.next()).value.toString().trimEnd()
console.log('Hello,', firstName)

console.write('What is your last name?\n> ')
const lastName = (await stdinIterator.next()).value.toString().trimEnd()
console.log('Welcome', `${firstName} ${lastName}`)

// 直接终止进程
process.exit(0)

内容的提问来源于stack exchange,提问作者Mir-Ismaili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:16:03