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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:57:11