Strapi注册成功但返回空data对象 无法获取jwt令牌问题排查
问题修复方案
先修正前端代码的低级错误
你当前代码有四处直接导致异常的问题:
- 混用
await与.then()链式调用,且.then()回调没有返回响应对象,await最终接收到的结果是console.log的返回值也就是undefined,根本拿不到接口实际返回内容 - 请求路径和你实际配置的接口不匹配:你提到可用的注册接口是
/api/auth/local/register,但代码里写的路径少了/api前缀,请求会打到错误的兜底路由上 - 多余传参:你手动传了
confirmed: "true",这个字段是Strapi用户表的内部受保护字段,公共接口不允许前端直接传值覆盖,而且你传的是字符串格式的"true"而非布尔值,会触发Strapi的参数过滤逻辑,甚至导致返回结构异常 - 接口最后直接用
res.status(200).end()返回空响应,就算拿到jwt前端也拿不到有效返回
修正后的代码:
// /pages/api/register.js import axios from 'axios' // 引入你项目使用的setCookie方法 // import setCookie from '你的工具方法路径' export default async(req, res) => { const {username, password, email} = req.body try { // 去掉冗余的.then调用,补全接口路径,删除无效的confirmed参数 const strapiResp = await axios.post(`${process.env.STRAPI_URL}/api/auth/local/register`, { username, email, password }) console.log('Strapi注册接口原始返回:', strapiResp.data) // 正常情况下strapiResp.data会包含jwt和user两个字段 // 解开注释即可正常写入cookie // setCookie({res}, 'jwt', strapiResp.data.jwt, { // httpOnly: true, // maxAge: 30 * 24 * 60 * 60, // path: '/' // }) // 向前端返回有效响应,不要直接结束请求 res.status(200).json({ code: 0, data: { user: strapiResp.data.user } }) } catch (e) { // 打印Strapi返回的真实错误信息方便排查 console.error('注册请求失败:', e.response?.data || e.message) res.status(400).json({ code: -1, msg: e.response?.data?.message || '注册失败' }) } }
再校验Strapi侧配置
如果改完代码还是返回空data,去Strapi后台检查以下配置:
- 进入
设置-用户与权限插件-角色-Public角色,在权限配置区的Auth分类下,确认register接口的权限已经勾选 - 同一页面找到
User模型的权限配置,确认需要返回的用户字段(username、email等)已勾选返回权限,未勾选的字段会被Strapi自动过滤 - 进入
设置-用户与权限插件-高级设置,确认邮箱验证开关为关闭状态,新用户默认角色设置为Authenticated
注意:不要在公共接口请求中传递confirmed、role这类用户表的敏感内部字段,Strapi默认会对这类参数做安全过滤,严重时会直接拦截请求返回空数据。
内容的提问来源于stack exchange,提问作者paytoncodes
相关产品推荐
相关产品推荐

