第一次在Sveltekit中使用fail(),所以我不知道如何修复它。
我在 $lib 中有一个 newsletter.svelte,它有一个简单的表单,用于在用户决定订阅新闻通讯时收集电子邮件地址:
$lib/components/newsletter.svelte :
<script>
$: emailvalue = null
async function emailsubscribe(){
console.log("emailsubscribe fn fired...emailvalue log:", emailvalue)
let posttheapi = await fetch('api/newsletter',{
method : "POST",
credentials : 'include',
headers: {
'Accept': 'application/json',
'Content-type' : 'application/json'
},
body: JSON.stringify({
useremail : emailvalue
})
})
let postresults = await posttheapi.json()
console.log("results log +page.svelte index page :", postresults )
}
</script>
<form on:submit|preventDefault={emailsubscribe}>
<div>
<label for="name">Email </label>
<input type="email" name="email" placeholder="Type here" bind:value={emailvalue} />
</div>
<button> Subscribe </button>
</form>
在routes/api/newsletter/+server.js内部,这是我捕获订阅电子邮件地址的方法:
import { RetryAfterRateLimiter } from 'sveltekit-rate-limiter/server';
const limiter = new RetryAfterRateLimiter({
//limiter options...
})
export async function POST(requestEvent){
await limiter.cookieLimiter?.preflight(requestEvent);
let readbody = await requestEvent.request.json()
// Every call to isLimited counts as a hit towards the ratelimit for the event.
const status = await limiter.check(requestEvent);
if (status.limited) {
requestEvent.setHeaders({
'Retry-After': status.retryAfter.toString()
});
return fail(429);
}
let subscribedemail = readbody.useremail
let success = true
return json({success, subscribedemail})
}
fail() 只能在 +page.server.js 中使用吗?或者我也可以在 +server.js 中使用它吗? 如果是,我收到错误“错误:来自路由 /api/newsletter 的无效响应:处理程序应返回响应对象”
我该如何解决这个问题或者如何让它工作?
fail
不适用于自定义端点(即 +server.js
),而是用于 表单操作。
这看起来也应该是一个表单操作(请参阅有关其工作原理的文档),这些位于
+page.server.js
文件中。在客户端上,您通常会使用表单上的 enhance
操作。
对于自定义端点,您必须返回完整的
Response
对象。