
deno 在 windows 平台上的 prompt() 函数存在输入长度限制(仅支持最多 255 字符),这是已知的底层 bug;本文提供无需额外依赖、兼容性强的纯 deno 替代实现方案。
deno 在 windows 平台上的 prompt() 函数存在输入长度限制(仅支持最多 255 字符),这是已知的底层 bug;本文提供无需额外依赖、兼容性强的纯 deno 替代实现方案。
在 Deno v1.34 及更早版本的 Windows 环境中,内置的 prompt() 函数受 Windows 控制台输入缓冲区机制限制,导致用户无法输入超过 255 个字符的文本(例如粘贴较长 JSON)。该问题已在 Deno Issue #19010 中被确认为 Windows 特定 bug,并非设计行为,而是底层 readline 实现缺陷。官方尚未修复,但已有稳定、轻量的绕过方案。
✅ 推荐解决方案:自定义 prompt() 替代函数
以下代码完全替代原生 prompt(),支持任意长度输入(取决于系统内存与终端实际支持),且不引入第三方依赖(仅使用 Deno 标准库):
import { readLines } from "https://deno.land/std@0.224.0/io/mod.ts";
async function prompt(promptText: string): Promise<string> {
const text = new TextEncoder().encode(`${promptText} `);
Deno.writeAllSync(Deno.stdout, text);
const { value: input } = await readLines(Deno.stdin).next();
return input ?? "";
}✅ 说明:
- 使用 readLines(Deno.stdin) 替代 Deno.stdin.readLine(),规避了 Windows 下 readLine() 的缓冲区截断逻辑;
- writeAllSync 确保提示文字立即刷新到控制台(避免异步延迟);
- 返回值做空值安全处理(?? ""),增强鲁棒性。
? 使用示例
// 示例:读取长 JSON 输入(无长度限制)
const jsonInput = await prompt("Paste your full JSON here (Ctrl+V, then Enter):");
try {
const data = JSON.parse(jsonInput);
console.log("✅ Parsed successfully:", Object.keys(data));
} catch (e) {
console.error("❌ Invalid JSON:", e.message);
}⚠️ 注意事项
- 平台无关性:该方案在 Windows / macOS / Linux 上均可靠运行,推荐作为跨平台项目的默认 prompt 实现;
- 标准库版本:请使用 std@0.224.0 或更高稳定版(低版本 io/mod.ts 路径可能不同,如 std@0.200.0 仍为 std/io/mod.ts);
- 交互体验:与原生 prompt() 一致——用户输入后按 Enter 提交,不支持编辑历史或行内光标移动(如需高级交互,请考虑 cliffy 等成熟 CLI 库);
- 安全性提示:此函数不进行输入清洗,若用于解析敏感数据(如密码、密钥),请结合 Deno.stdin.setRaw(true) 实现隐藏输入(需额外处理回车与退格逻辑)。
✅ 总结
原生 prompt() 的 255 字符限制是 Deno 在 Windows 上的临时缺陷,而非 API 设计约束。通过标准库 readLines 构建的轻量替代函数,既保持了简洁接口,又彻底解除长度枷锁。建议在所有需要可靠长文本输入的 Deno CLI 工具中直接集成该实现——零依赖、易维护、跨平台就绪。










