自定义Netlify无服务器函数无法从Prismic API获取数据如何解决?
问题排查与修复方案
你的代码存在多个核心错误,逐个修复即可解决报错:
- handler函数未返回异步流程:Netlify异步无服务器函数要求必须返回Promise/使用await标记异步流程,你的代码未返回内部的Prismic调用链,导致函数提前退出,触发500错误。
req变量未定义:你在初始化Prismic客户端时传入了{ req: req },但handler函数没有接收任何参数,req属于未声明变量,直接抛出引用错误。如果不需要使用Prismic预览模式,可以直接删除该配置项。
- 非async函数内使用
await:你在普通.then()回调函数内调用了await,但该回调没有被async标记,直接触发语法错误。
- 非async函数内使用
- 多余的
.json()调用:Prismic官方SDK返回的查询结果已经是解析完成的JS对象,不需要再调用类似fetch API的.json()方法,该调用会直接抛出异常。
- 多余的
- 缺少错误捕获:未处理的Promise异常会导致接口返回纯文本错误信息,前端尝试将文本解析为JSON时就会触发
Unexpected token S in JSON at position 0的报错。
- 缺少错误捕获:未处理的Promise异常会导致接口返回纯文本错误信息,前端尝试将文本解析为JSON时就会触发
修复后完整代码
const Prismic = require("@prismicio/client"); exports.handler = async function (event) { try { // 初始化Prismic客户端,移除未定义的req配置,不需要预览可直接省略 const api = await Prismic.client("https://my-repository.cdn.prismic.io/api/v2"); // 查询product类型的所有文档 const response = await api.query(Prismic.Predicates.at("document.type", "product")); // 直接返回Prismic返回的结果,不需要二次解析 return { statusCode: 200, headers: { "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" // 可选,如果跨域调用需要添加CORS头 }, body: JSON.stringify(response.results) // 直接返回产品列表数组,适配Snipcart的爬取规则 }; } catch (error) { // 捕获错误返回规范响应 return { statusCode: 500, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ error: error.message }) }; } };
额外适配提示
如果要满足Snipcart的JSON爬取要求,返回的JSON结构需要包含id、price、name三个必填字段,你可以在拼接返回body时遍历response.results,把Prismic存储的产品字段映射为Snipcart要求的格式即可。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

