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>
四、重新部署验证
- 执行
npm run build构建项目,确保输出目录为dist - 重新部署到Cloudflare Pages后,访问站点即可使用TODO功能,同时Error 1102问题会因静态模式或优化后的逻辑得到解决
内容的提问来源于stack exchange,提问作者simultsop
相关产品推荐
相关产品推荐

