You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

客户端调用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"
}

问题排查与修复

  1. 异步操作未正确等待:云函数声明了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);
  }
};
  1. 环境变量与权限检查:

    • 确认云函数已配置APPWRITE_FUNCTION_ENDPOINT、APPWRITE_FUNCTION_API_KEY、APPWRITE_FUNCTION_PROJECT_ID三个环境变量
    • 确保API_KEY拥有databases.write权限,否则无法创建数据库
  2. 参数格式验证:

    • 客户端传递的teamId必须符合Appwrite资源ID的规则(只能包含小写字母、数字、连字符和下划线),避免因ID格式错误导致创建失败
    • 可在客户端或云函数中添加参数格式校验
  3. 超时时间调整:当前云函数超时配置为15秒,若为自托管Appwrite实例且网络延迟较高,可适当调高timeout值(最大60秒),但优先解决代码异步问题

内容的提问来源于stack exchange,提问作者Brad Stewart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:10:15