Strapi Passwordless插件自定义createToken函数未生效问题排查
问题排查与修复方案
你的代码存在几个关键问题,导致重写的函数未生效或功能异常,逐一说明:
1. customAlphabet未执行生成验证码
customAlphabet是nanoid库提供的生成验证码生成器的函数,你当前只是引用了这个函数,没有执行它来生成实际的6位数字验证码。需要在后面添加()调用:
const body = customAlphabet("1234567890", 6)();
2. this.settings()上下文错误
在重写的函数中,this的指向不再是原插件的service实例,直接调用this.settings()会报错或无法获取正确配置。应该通过插件服务实例调用:
// 替换原settings获取方式 const settings = await plugin.services.passwordless.settings();
3. 异步操作未加await
tokensService.update是异步方法,你没有添加await会导致旧token还未失效就创建新token,引发逻辑问题:
await tokensService.update({ where: { email }, data: { is_active: false } });
4. 扩展文件路径与Strapi版本匹配问题
确保你的文件路径是Strapi v4要求的位置:src/extensions/strapi-plugin-passwordless/strapi-server.js,如果是根目录下的extensions文件夹,在v4中可能不被识别,需要移到src目录内。
5. 未重启Strapi服务
修改插件扩展代码后,必须重启Strapi服务才能让新代码生效,否则会继续运行node_modules中的原函数。
修正后的完整代码
const { customAlphabet } = require('nanoid'); // 确保引入nanoid,原插件依赖它 module.exports = (plugin) => { plugin.services.passwordless.createToken = async (email, context) => { const settings = await plugin.services.passwordless.settings(); const tokensService = strapi.query("plugin::passwordless.token"); await tokensService.update({ where: { email }, data: { is_active: false } }); const body = customAlphabet("1234567890", 6)(); const tokenInfo = { email, body, context: JSON.stringify(context), }; return tokensService.create({ data: tokenInfo }); }; return plugin; };
内容的提问来源于stack exchange,提问作者wladknd
相关产品推荐
相关产品推荐

