I am creating a test and it is popping up at the UI level with insufficient permissions.
run script code:module.exports = async function(data) {
// slugify 函数定义在 module.exports 函数的开始部分
function slugify(text) {
if (typeof text !== ‘string’ || text.trim() === ‘’) {
return ‘’;
}
return text.toLowerCase().trim()
.replace(/\s+/g, ‘-’)
.replace(/[^\w-]+/g, ‘’) // 移除非字母、数字、下划线、连字符的字符
.replace(/–+/g, ‘-’)
.replace(/^-+|-+$/g, ‘’); // 移除开头和结尾的连字符
}
// 调试信息,非常重要,用于查看传入 data 的结构
// console.log(‘— Run Script (Filter Hook) START —’);
// console.log(‘Input data object:’, JSON.stringify(data, null, 2));
if (!data || !data.$trigger || typeof data.$trigger.payload !== ‘object’ || data.$trigger.payload === null) {
console.error(‘Flow Script Error: $trigger.payload is missing or not an object.’);
throw new Error(‘Critical: $trigger.payload is invalid in Run Script for slug generation.’);
}
let payloadToModify = { …data.$trigger.payload }; // 操作 payload 的副本
let nameToSlugify;
let finalSlug = ‘’; // 初始化 finalSlug 为空字符串,避免 undefined
// console.log(‘Filter Hook - $trigger event:’, data.$trigger.event);
// console.log(‘Filter Hook - Initial payloadToModify:’, JSON.stringify(payloadToModify, null, 2));
if (data.$trigger.event.endsWith(‘.create’)) {
// 创建事件
if (payloadToModify && typeof payloadToModify.name === ‘string’ && payloadToModify.name.trim() !== ‘’) {
nameToSlugify = payloadToModify.name;
finalSlug = slugify(nameToSlugify);
} else {
// name 字段是必填的,理论上不应为空。如果为空,则 slug 无法生成。
console.error(‘Create event: Name field is missing or empty in payload. Name field is required.’);
throw new Error(‘Create event: Name field is missing or empty in payload. Slug cannot be generated.’);
}
} else if (data.$trigger.event.endsWith(‘.update’)) {
// 更新事件
// 对于 Filter Hook 的 update,我们需要 Read Data 操作来获取完整的当前条目数据,
// 因为 $trigger.payload 可能只包含被修改的字段。
// data.read_current_item 应该是上一步 Read Data 操作的输出。
// 重要:如果您的 Flow 中没有 Read Data 操作,这里的逻辑需要大幅简化,
// 并且只能处理 name 字段在当前更新中被修改的情况。
// **假设您的 Flow 结构是:Trigger (Filter) -> Read Data (key: read_current_item) -> Run Script**
const currentItem = data.read_current_item; // <<--- 确保 'read_current_item' 是您 Read Data 操作的正确 Key
if (!currentItem) {
console.error('Update event: Could not retrieve current item data from "Read Data" step (expected at data.read_current_item).');
throw new Error('Update event: Failed to get current item data to determine slug.');
}
if (payloadToModify && payloadToModify.hasOwnProperty('name')) {
// 情况1:Name 字段在当前的更新中被明确修改了
if (typeof payloadToModify.name === 'string' && payloadToModify.name.trim() !== '') {
nameToSlugify = payloadToModify.name;
finalSlug = slugify(nameToSlugify);
// console.log('Update event: Name was modified in payload. New slug:', finalSlug);
} else {
// Name 被清空或设为无效值,而 name 是必填的。
console.error('Update event: Name field was cleared or set to an invalid value, but name is required.');
throw new Error('Update event: Name field was cleared or set to an invalid value. Slug cannot be generated.');
}
} else {
// 情况2:Name 字段没有在当前的更新中被修改。
// 我们应该使用数据库中已有的 name (来自 Read Data) 来保持 slug 的一致性,
// 或者直接使用已有的 slug。
if (currentItem && typeof currentItem.name === 'string') {
nameToSlugify = currentItem.name; // 使用数据库中当前的 name
// 如果 slug 已经存在并且有效,通常不应该轻易改变它,除非 name 真的变了。
// 如果业务逻辑是 name 没变,slug 就不变,那么应该用 currentItem.slug。
finalSlug = currentItem.slug || slugify(nameToSlugify); // 如果已有 slug 就用,否则基于当前 name 生成
// console.log('Update event: Name not modified in payload. Using existing slug or regenerating from current name. Slug:', finalSlug);
} else {
console.error('Update event: Could not determine name from current item data (Read Data step).');
throw new Error('Update event: Could not determine name for slug generation from existing item.');
}
}
} else {
console.error(Unhandled event type: ${data.$trigger.event}
);
throw new Error(Unhandled event type: ${data.$trigger.event}
);
}
// 最终检查生成的 slug 是否为空,因为 slug 是必填的
if (finalSlug === ‘’) {
// 这通常意味着 name 本身是空的、无效的,或者 slugify 后变成了空(例如 name 都是特殊字符)
// 既然 name 也是必填的,这种情况理论上应该先被 name 的验证捕获。
// 但为了保险起见,如果 slug 为空,我们抛出错误。
console.error(Generated slug is empty. Original name to slugify was: "${nameToSlugify}". Slug cannot be empty as it is required.
);
throw new Error(Generated slug is empty from name: "${nameToSlugify}". Slug cannot be empty as it is required.
);
}
payloadToModify.slug = finalSlug;
// console.log(‘Run Script: Returning modified payload:’, JSON.stringify(payloadToModify, null, 2));
// console.log(‘— Run Script (Filter Hook) END —’);
return payloadToModify;
};