You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:02:42