如何使用Node.js读取WorldEdit的.schem格式文件
Node.js 读写.schem 二进制文件无修改解决方案
问题根源
.schem 是 Minecraft WorldEdit 采用的二进制 NBT 格式文件,大部分读写异常都是因为操作时误用了文本编码:默认情况下 fs.readFile 如果指定了 utf8、gbk 等文本编码,Node 会自动将二进制字节转为字符串,不符合文本编码规则的字节会被替换为乱码占位符,写回文件时就会破坏原始结构,导致 WorldEdit 无法识别。
正确实现代码
回调式读写
const fs = require('fs'); // 读取时不传入encoding参数,或显式传入null,返回值为原始二进制Buffer fs.readFile('./test.schem', (err, schemBuffer) => { if (err) throw err; // 全程不要对schemBuffer执行toString()等文本转换操作 fs.writeFile('./output.schem', schemBuffer, (err) => { if (err) throw err; console.log('文件写入完成,原始内容未修改'); }); });
Promise 异步写法(Node 10+ 推荐)
const fs = require('fs/promises'); async function handleSchemFile(srcPath, outputPath) { // 直接读取得到原始二进制Buffer const schemBuffer = await fs.readFile(srcPath); // 直接写入Buffer即可 await fs.writeFile(outputPath, schemBuffer); }
上传场景注意事项
- 若使用 Express、Koa 等框架处理.schem 文件上传,不要在对应接口上启用
express.text()、express.json()等文本解析中间件 - 推荐使用
multer等专门的文件上传处理库,直接获取上传文件的原始 Buffer 进行存储,避免经过文本转换环节
内容的提问来源于stack exchange,提问作者Dorian Crutcher
相关产品推荐
相关产品推荐

