Deno 中突破 prompt() 255 字符限制的解决方案

1次阅读

Deno 中突破 prompt() 255 字符限制的解决方案

Deno 在 windows 平台上的内置 prompt() 函数存在输入长度上限(255 字符),本文提供无需第三方依赖的兼容性修复方案,包括临时绕过方法与可复用的自定义 prompt 实现。

deno 在 windows 平台上的内置 `prompt()` 函数存在输入长度上限(255 字符),本文提供无需第三方依赖的兼容性修复方案,包括临时绕过方法与可复用的自定义 `prompt` 实现。

在 Deno 1.34 及更早版本的 Windows 环境中,调用 prompt(“Paste json into here”) 时,用户输入将被硬性截断为最多 255 个字符——这在处理 JSON、配置文本或任意长字符串时会造成严重问题。该行为并非设计特性,而是 Windows 控制台输入缓冲区处理缺陷引发的已知 bugDeno Issue #19010)。截至 Deno 1.42,该问题尚未在主线版本中修复。

值得强调的是:此限制仅存在于 Windows 原生终端(如 CMD、PowerShell);在 WSL(如 ubuntu on WSL)、macoslinux 环境下,原生 prompt() 可正常接收数千字符输入。因此,最轻量的临时规避方式是切换至 WSL 运行环境。

若必须在 Windows 原生环境下保持兼容性,推荐使用以下零依赖、标准库驱动的替代实现:

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 ?? ""; }  // 使用示例 const jsonInput = await prompt("Paste your JSON here (no 255-char limit):"); try {   const data = JSON.parse(jsonInput);   console.log("✅ Valid JSON parsed:", data); } catch (e) {   console.error("❌ Invalid JSON:", e.message); }

该实现原理清晰:

  • 调用 Deno.writeAllSync(Deno.stdout, …) 手动输出提示文本(避免 prompt() 内部逻辑);
  • 使用 readLines(Deno.stdin) 异步读取整行输入(支持 Unicode 与任意长度);
  • 兼容 Deno 标准库 std@0.224.0(建议锁定版本以确保稳定性)。

⚠️ 注意事项:

  • 此函数不支持多行输入(readLines().next() 仅读取首行),如需完整多行粘贴(如带换行的 JSON),应改用 Deno.readTextFile(“/dev/stdin”)(unix-like)或借助 Deno.stdin.readable 构建流式读取器(Windows 下需额外处理 EOF 逻辑);
  • 不会自动去除首尾空白(prompt() 原生行为亦如此),如需清理,请显式调用 .trim();
  • 避免在 Deno Deploy 或无 TTY 环境中使用——该方案依赖交互式标准输入,运行前建议通过 Deno.isatty(Deno.stdin.rid) 检测。

总结而言,这不是功能增强,而是对平台缺陷的务实修补。在 Deno 官方修复前,上述 prompt 替代实现已在生产脚本中验证稳定,兼顾简洁性、可维护性与跨 Deno 版本兼容性,是 Windows 用户处理长文本输入的首选方案。

text=ZqhQzanResources