Netlify部署Lambda函数报window is undefined错误排查
问题核心原因
Netlify Lambda函数运行在服务端Node.js环境,不存在浏览器专属的window全局对象,因此你写的typeof window !== 'undefined'判断永远返回false,块内逻辑自然不会执行。本地测试正常是因为你此前是在浏览器客户端环境运行这段代码,和Lambda的服务端运行环境完全不同。
用户点击验证邮件的链接发起请求时,所有URL参数、请求信息都已经封装在Lambda函数的入参event对象里,完全不需要依赖window.location截取链接。
可行修复方案
- 移除所有和
window相关的逻辑,直接从event.queryStringParameters中读取链接携带的JWT令牌 - 给JWT校验、数据库操作加错误捕获,避免非法/过期token导致函数崩溃
- 数据库更新操作需要加
await等待执行完成,再给用户返回响应/跳转 - 校验完成后通过302状态码把用户重定向到对应的结果页(验证成功页/链接过期提示页)
修正后的函数代码参考:
const jwt = require('jsonwebtoken'); // 提前引入你的User模型 const User = require('./你的User模型路径'); exports.handler = async (event) => { try { // 直接从请求query里取token,对应链接格式:你的函数地址?token=xxx const token = event.queryStringParameters?.token; if (!token) { // 没有token直接跳错误页 return { statusCode: 302, headers: { Location: '/verify-fail?msg=链接无效' } } } // 校验JWT const decoded = jwt.verify(token, process.env.SECRET); const { email } = decoded; // 等待数据库更新完成 await User.findOneAndUpdate({ email }, { verified: true }); // 校验成功跳转到成功页 return { statusCode: 302, headers: { Location: '/verify-success' } } } catch (err) { console.log('邮箱验证出错:', err); // token过期、篡改、数据库报错都跳错误页 return { statusCode: 302, headers: { Location: '/verify-fail?msg=链接已过期,请重新注册' } } } };
额外注意事项
- 发验证邮件时,拼接的验证链接请明确使用
token作为查询参数名,格式参考:https://你的站点域名/.netlify/functions/verify?token=签发的jwt字符串,不要无键名直接拼接token,避免参数解析错误 - Lambda函数里的
console.log输出不会出现在浏览器控制台,要去Netlify后台的函数日志面板查看打印内容
内容的提问来源于stack exchange,提问作者Jenny
相关产品推荐
相关产品推荐

