在AWS Lambda中使用Wkhtmltopdf测试失败,请求技术支持
解决AWS Lambda中Wkhtmltopdf转PDF时的TypeError: Cannot read property 'toString' of null错误
这个错误的根源很清晰:你的/var/task/index.js第25行代码尝试对一个null值调用toString()方法,直接导致Lambda进程提前退出。结合CloudWatch的调用栈来看,错误发生在AWS SDK的请求响应回调里,大概率和S3对象读取或请求参数处理有关。
下面是具体的排查和修复步骤:
1. 定位第25行的具体代码
先打开你的index.js文件找到第25行,这类错误的代码通常类似:
const htmlContent = response.Body.toString();
这里的response.Body是null,所以调用toString()时抛出了异常。
2. 排查异步操作的返回值
从调用栈能看出错误来自AWS SDK的请求回调(比如S3的getObject方法),优先检查这几个点:
- 你指定的S3 Bucket名称是否正确,目标HTML文件是否确实存在于该Bucket中?
- Lambda的执行角色是否拥有该S3 Bucket的
s3:GetObject权限?权限不足时S3会返回空Body或错误响应。 - 如果HTML内容来自API Gateway请求体,要确认测试请求是否正确传递了内容,有没有出现
event.body为null的情况?
3. 添加空值判断修复代码
不管是哪种场景,在调用toString()前先判断值是否存在,就能避免这个错误。给两个常见场景的修复示例:
场景1:从S3读取HTML内容
s3.getObject(params, (err, response) => { if (err) { console.error("从S3获取内容失败:", err); callback(err); return; } // 先判断Body是否存在再调用toString() if (!response.Body) { const error = new Error("获取内容失败:S3对象Body为空"); console.error(error.message); callback(error); return; } const htmlContent = response.Body.toString(); // 后续Wkhtmltopdf处理逻辑 });
场景2:从API Gateway请求体获取HTML内容
exports.handler = (event, context, callback) => { // 检查请求体是否存在 if (!event.body) { const error = new Error("请求体缺失:需要传入HTML内容"); console.error(error.message); callback(error); return; } const htmlContent = event.body.toString(); // 后续处理逻辑 };
4. 重新测试并查看日志
修复代码后重新部署Lambda并测试,如果还有问题,查看CloudWatch完整日志,确认异步操作的具体错误(比如S3权限错误、对象不存在错误),再针对性解决。
内容的提问来源于stack exchange,提问作者Ergun
相关产品推荐
相关产品推荐

