Lambda运行报错yaml.DEFAULT_SCHEMA.extend is not a function的解决求助
解决YAML Schema.extend 不是函数的错误
你遇到的问题是因为所用的yaml库版本为v2+,这个版本完全重构了API,原有的DEFAULT_SCHEMA.extend和Schema.extend方法已经被移除,需要使用新的自定义Schema方式。
解决方案
方法1:适配yaml v2+ API(推荐)
yaml v2使用yaml.Type定义自定义标签,再通过yaml.Schema.create()组合默认Schema与自定义类型,具体修改如下:
const yaml = require('yaml'); const fs = require('fs'); // 定义自定义标签类型 const customTagType = new yaml.Type('!CustomYamlTag', { kind: 'mapping', // 根据你的数据结构调整:mapping(对象)/scalar(单值)/sequence(数组) construct: (data) => { // 解析YAML时的构造逻辑,返回CustomYamlTag实例 return new CustomYamlTag(data.type, data.data); }, // 若需要序列化YAML,添加represent方法 represent: (obj) => { return { type: obj.type, data: obj.data }; } }); class CustomYamlTag { constructor(type, data) { this.type = type; this.data = data; } } // Lambda handler exports.handler = event => { // logger.info('Event', event); // 创建包含自定义类型的Schema const SCHEMA = yaml.Schema.create([customTagType, yaml.DEFAULT_SCHEMA]); // v2推荐用parse替代load,功能一致 let TemplateBody = yaml.parse(fs.readFileSync('templates/TEMPLATEFILE.yml', 'utf8'), { schema: SCHEMA }); // ... 后续业务逻辑 };
方法2:降级到yaml v1.x(不推荐)
如果不想修改代码,可以降级到仍支持extend方法的v1版本:
npm install yaml@1.10.2
此方法仅作为临时方案,因为v1版本已停止维护,存在安全风险。
关键变化说明
- v2中推荐使用
yaml.parse()替代yaml.load()(load仍兼容,但parse更符合现代API命名) - 自定义标签需通过
yaml.Type创建,而非原有的extend方式 - 用
yaml.Schema.create()组合Schema,替代原有的extend方法
内容的提问来源于stack exchange,提问作者raosa
相关产品推荐
相关产品推荐

