SendGrid请求后.then内代码本地正常但Vercel生产环境无输出
Vercel生产环境中console.log不执行的原因分析
核心原因推测
1. Serverless函数执行上下文提前回收
Vercel的Serverless函数会在Promise resolve后快速终止执行上下文,即使.then()回调里的代码还没完成执行。你的代码中返回了sgMail.send(msg).then(...)的Promise,当邮件发送完成(Promise resolve),Vercel可能直接结束进程,导致console.log还没来得及被日志系统捕获就被终止了。
2. 异步回调的日志捕获时机差异
本地环境中Node.js会等待所有微任务执行完毕再退出,但Vercel的Serverless运行时为了优化资源利用率,可能不会等待.then()这类微任务回调完成,就直接回收函数实例,进而导致日志丢失。
验证与解决方法
方法1:改用async/await确保同步执行
将代码改为async/await写法,确保console.log在函数执行上下文内完成:
async function sendGridMail(email: string, unsubscribeLink: string, msg: string) { sgMail.setApiKey(process.env.SENDGRID_API_KEY_TEST!) try { await sgMail.send(msg) console.log('email sent') } catch (error) { console.log(error.message) } }
这种写法会等待邮件发送完成后再执行console.log,函数执行完毕后才会结束上下文,日志能被正常捕获。
方法2:检查Vercel日志过滤设置
登录Vercel控制台,查看对应函数的日志面板,确认是否开启了日志级别过滤(比如是否隐藏了info级别的日志)。默认情况下console.log属于info级别,若被过滤则无法显示。
方法3:测试基础日志输出
在函数开头添加console.log('function started'),验证Vercel是否能捕获基础日志。如果这条日志能显示,说明问题确实出在异步回调的时机上;如果也不显示,可能是函数的日志配置存在异常。
内容的提问来源于stack exchange,提问作者Flavio Silva
相关产品推荐
相关产品推荐

