客户端调用Appwrite云函数超时报错排查求助
调用Appwrite云函数创建数据库时遇到超时错误
首次从客户端调用Appwrite云函数,要给刚创建的团队生成与团队ID、名称一致的数据库,触发以下错误:
An internal curl error has occurred within the executor! Error Msg: Operation timed out
日志显示:
No logs recorded
云函数代码
const sdk = require("node-appwrite"); module.exports = async function (req, res) { const client = new sdk.Client(); const database = new sdk.Databases(client); if ( !req.variables.APPWRITE_FUNCTION_ENDPOINT || !req.variables.APPWRITE_FUNCTION_API_KEY ) { console.warn( "Environment variables are not set. Function cannot use Appwrite SDK." ); } else { client .setEndpoint(req.variables.APPWRITE_FUNCTION_ENDPOINT) .setProject(req.variables.APPWRITE_FUNCTION_PROJECT_ID) .setKey(req.variables.APPWRITE_FUNCTION_API_KEY) .setSelfSigned(true); } const payload = JSON.parse(req.variables.APPWRITE_FUNCTION_DATA); const promise = database.create(payload.teamId, payload.teamName); promise.then( function (response) { req.json(response); }, function (error) { req.json(error); } ); };
客户端调用代码
import { useFunction } from "react-appwrite"; const setupTeamDatabase = useFunction("647687110d37ce2558c1"); const teamDetails = JSON.stringify({ teamId: createTeam.$id, teamName: createTeam.name, }); const createDatabase = await setupTeamDatabase.mutateAsync(teamDetails);
appwrite.json配置
{ "$id": "647687110d37ce2558c1", "name": "setupTeam", "runtime": "node-16.0", "path": "functions/setupTeam", "entrypoint": "src/index.js", "ignore": ["node_modules", ".npm"], "execute": ["users"], "events": [], "schedule": "", "timeout": 15 }
package.json配置
{ "node-appwrite": "^9.0.0", "appwrite": "^11.0.0", "react-appwrite": "^0.4.2" }
问题排查与修复
- 异步操作未正确等待:云函数声明了
async但没有等待database.create的Promise完成,导致函数提前终止,触发超时。修改代码用await替代then,并完善错误处理:
修改后的云函数代码:
const sdk = require("node-appwrite"); module.exports = async function (req, res) { const client = new sdk.Client(); const database = new sdk.Databases(client); // 先检查环境变量,缺失直接返回错误 if ( !req.variables.APPWRITE_FUNCTION_ENDPOINT || !req.variables.APPWRITE_FUNCTION_API_KEY || !req.variables.APPWRITE_FUNCTION_PROJECT_ID ) { const errorMsg = "Environment variables are not set. Function cannot use Appwrite SDK."; console.warn(errorMsg); return res.json({ error: errorMsg }, 500); } // 初始化客户端 client .setEndpoint(req.variables.APPWRITE_FUNCTION_ENDPOINT) .setProject(req.variables.APPWRITE_FUNCTION_PROJECT_ID) .setKey(req.variables.APPWRITE_FUNCTION_API_KEY) .setSelfSigned(true); try { const payload = JSON.parse(req.variables.APPWRITE_FUNCTION_DATA); // 等待数据库创建完成 const response = await database.create(payload.teamId, payload.teamName); return res.json(response); } catch (error) { console.error("Failed to create database:", error); return res.json({ error: error.message }, 500); } };
环境变量与权限检查:
- 确认云函数已配置
APPWRITE_FUNCTION_ENDPOINT、APPWRITE_FUNCTION_API_KEY、APPWRITE_FUNCTION_PROJECT_ID三个环境变量 - 确保API_KEY拥有
databases.write权限,否则无法创建数据库
- 确认云函数已配置
参数格式验证:
- 客户端传递的
teamId必须符合Appwrite资源ID的规则(只能包含小写字母、数字、连字符和下划线),避免因ID格式错误导致创建失败 - 可在客户端或云函数中添加参数格式校验
- 客户端传递的
超时时间调整:当前云函数超时配置为15秒,若为自托管Appwrite实例且网络延迟较高,可适当调高
timeout值(最大60秒),但优先解决代码异步问题
内容的提问来源于stack exchange,提问作者Brad Stewart
相关产品推荐
相关产品推荐

