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

Nuxt 3+Cloudflare Pages与KV绑定交互遇1102错误,求基础实现指导

解决Cloudflare Pages Nuxt应用Error 1102问题并实现KV绑定TODO功能

一、Error 1102 问题排查与修复

Error 1102是Cloudflare Worker超出资源限制(CPU/内存/执行时间)触发的报错,针对Nuxt应用常见原因和解决方式:

  • 切换渲染模式:如果当前用SSR模式,Cloudflare Pages Worker默认配额有限(执行时间上限10秒),复杂渲染易触发限制。建议在nuxt.config.ts中设置ssr: false切换为静态生成模式,构建后输出纯静态资源,彻底避免Worker执行负载问题。
  • 优化逻辑:检查Server Routes中是否有无限循环、重复KV查询等冗余逻辑,确保每段代码执行高效简洁。
  • 升级配额:如果必须用SSR,可升级Cloudflare套餐获取更高Worker资源配额(针对付费用户)。

二、Cloudflare KV与Nuxt应用的绑定配置

1. 创建KV命名空间

在Cloudflare控制台:

  • 进入「Workers & Pages」→「KV」→ 点击「创建命名空间」(比如命名为TodoKV)

2. 绑定KV到Pages项目

  • 进入你的Pages项目→「Settings」→「Functions」→「KV Namespace Bindings」
  • 添加绑定:名称填TODO_KV(需和代码中引用名一致),选择刚创建的KV命名空间

三、实现简易TODO功能

1. 编写Server Routes(后端接口)

在Nuxt项目的server/api/todo/目录下创建以下文件:

获取所有TODO(get.ts)

export default defineEventHandler(async () => {
  const todosList = await TODO_KV.list();
  const todos = [];
  for (const key of todosList.keys) {
    const todoStr = await TODO_KV.get(key.name);
    if (todoStr) todos.push(JSON.parse(todoStr));
  }
  return todos;
});

添加TODO(post.ts)

export default defineEventHandler(async (event) => {
  const { text } = await readBody(event);
  const id = crypto.randomUUID();
  await TODO_KV.put(id, JSON.stringify({ id, text, completed: false }));
  return { success: true, id };
});

更新TODO状态(put/[id].ts)

export default defineEventHandler(async (event) => {
  const { id } = getRouterParams(event);
  const { completed } = await readBody(event);
  
  const existingTodo = await TODO_KV.get(id);
  if (!existingTodo) throw createError({ statusCode: 404, message: 'TODO不存在' });
  
  const updatedTodo = { ...JSON.parse(existingTodo), completed };
  await TODO_KV.put(id, JSON.stringify(updatedTodo));
  return { success: true };
});

删除TODO(delete/[id].ts)

export default defineEventHandler(async (event) => {
  const { id } = getRouterParams(event);
  await TODO_KV.delete(id);
  return { success: true };
});

2. 前端页面交互实现

在pages/index.vue中编写页面代码:

<template>
  <div class="todo-wrap">
    <h1>我的TODO列表</h1>
    <input 
      v-model="newTodoText" 
      @keyup.enter="handleAddTodo"
      placeholder="输入新的TODO内容"
      class="todo-input"
    />
    <div class="todo-list">
      <div v-for="todo in todos" :key="todo.id" class="todo-item">
        <input 
          type="checkbox" 
          v-model="todo.completed"
          @change="handleUpdateTodo(todo)"
        />
        <span :class="{ completed: todo.completed }">{{ todo.text }}</span>
        <button @click="handleDeleteTodo(todo.id)" class="delete-btn">删除</button>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';

const newTodoText = ref('');
const todos = ref([]);

// 加载TODO列表
const loadTodos = async () => {
  const res = await fetch('/api/todo/get');
  todos.value = await res.json();
};

// 添加TODO
const handleAddTodo = async () => {
  if (!newTodoText.value.trim()) return;
  await fetch('/api/todo/post', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ text: newTodoText.value })
  });
  newTodoText.value = '';
  await loadTodos();
};

// 更新TODO状态
const handleUpdateTodo = async (todo) => {
  await fetch(`/api/todo/put/${todo.id}`, {
    method: 'PUT',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ completed: todo.completed })
  });
};

// 删除TODO
const handleDeleteTodo = async (id) => {
  await fetch(`/api/todo/delete/${id}`, { method: 'DELETE' });
  await loadTodos();
};

onMounted(loadTodos);
</script>

<style scoped>
.todo-wrap {
  max-width: 600px;
  margin: 2rem auto;
  padding: 0 1rem;
}

.todo-input {
  width: 100%;
  padding: 0.8rem;
  font-size: 1rem;
  margin-bottom: 1.5rem;
  border: 1px solid #eee;
  border-radius: 4px;
}

.todo-item {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 0.8rem;
  border-bottom: 1px solid #eee;
}

.completed {
  text-decoration: line-through;
  color: #999;
}

.delete-btn {
  margin-left: auto;
  padding: 0.4rem 0.8rem;
  background-color: #ff4444;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
}
</style>

四、重新部署验证

  1. 执行npm run build构建项目,确保输出目录为dist
  2. 重新部署到Cloudflare Pages后,访问站点即可使用TODO功能,同时Error 1102问题会因静态模式或优化后的逻辑得到解决

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:22:48