如何解决Netlify无服务器函数访问Notion DB时的权限共享错误?
问题背景
我在Netlify部署了serverless function,通过Internal Integration Token获取Notion数据库数据,前端调用代码如下:
const promise = fetch('<deployed website url on netlify>/.netlify/functions/notion-proxy'); promise.then(response => response.json()) .then(data => console.log(data)) .catch(error => console.error(error));
函数已触发,但捕获到自定义“Internal server error”,响应体提示“Make sure the relevant pages and databases are shared with your integration”。尽管已将数据库共享给集成、检查权限并多次重新共享,错误仍存在。
serverless函数代码如下:
import { Client } from "@notionhq/client"; const apiKey = process.env.API_KEY; const databaseId = process.env.DATABASE_ID; const notion = new Client({ auth: apiKey }); const username = ""; // Notion username const handler = async (event) => { try { const response = await notion.databases.query({ database_id: databaseId, filter: { property: "ID", rich_text: { contains: username, }, }, }); return { statusCode: 200, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type", "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE", }, body: JSON.stringify(response), }; } catch (error) { console.log("error.body: ", error.body); return { statusCode: 500, headers: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Headers": "Content-Type", "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE", }, body: JSON.stringify({ error: "Internal server error", errorBody: error.body }), }; } }; module.exports = { handler };
后续需在Webflow中查询数据,求解决权限错误的可行方法。
排查解决方法
验证环境变量准确性
检查Netlify后台的API_KEY和DATABASE_ID环境变量:API_KEY必须是Notion集成的完整Internal Integration Token,无多余空格、换行或拼写错误DATABASE_ID需从数据库URL中准确提取(URL中https://www.notion.so/后的32位字符串),也可通过Notion API的search接口验证ID有效性
检查数据库父页面权限
若数据库嵌套在某个页面下,需确保父页面也共享给了该集成。Notion权限具有继承性,父页面未授权会导致子数据库无法被集成访问。测试无过滤的基础查询
暂时移除filter条件,简化查询逻辑验证是否能获取数据:const response = await notion.databases.query({ database_id: databaseId // 注释掉filter部分 });如果能返回数据,说明问题出在filter逻辑(比如
ID属性名称错误、属性类型不匹配,或username为空导致过滤无结果),而非权限问题。重新生成并更新集成Token
进入Notion集成管理页面,删除原Internal Integration Token并重新生成,替换Netlify的API_KEY环境变量后重新部署函数,排除Token缓存或失效问题。确认集成权限范围
检查Notion集成的权限配置,确保勾选了Read content权限(数据库查询必须的读权限),若后续有写操作需补充对应权限。查看Netlify函数完整日志
登录Netlify后台,找到对应的serverless function,查看详细错误日志(不仅是返回的errorBody),日志可能包含Token无效、数据库ID不存在等更具体的报错信息。直接调用Notion API验证
使用Postman或curl直接调用Notion数据库查询接口,用相同的Token和Database ID测试:curl -X POST "https://api.notion.com/v1/databases/{database_id}/query" \ -H "Authorization: Bearer {API_KEY}" \ -H "Notion-Version: 2022-06-28" \ -H "Content-Type: application/json" \ -d '{}'若直接调用也报错,说明问题在Notion端(权限或配置);若直接调用成功,说明问题出在Netlify函数的代码或环境配置。
内容的提问来源于stack exchange,提问作者Max Polinka

