使 JS API: array.includes(key) 没有按预期工作
Making an JS API: array.includes(key) not working as expected
我为 Cloudflare 工作人员编写了这段代码。
当在 Stripe 上创建新客户时,会触发 webhook 并将新客户数据 return 发送到 [...].worker.dev/updateCustomers
Cloudflare 工作人员然后将执行以下操作:
- 从客户JSON对象中获取名称
- 创建一个字符串周围没有“”的版本
- 将新客户添加到名为 customers[] 的数组中
- 出于调试原因,它将使用以下内容响应 Stripe:新客户名称、数组中的所有客户以及如果新客户名称包含在数组中的结果
如果用户打开到“https://[...]workers.dev/validate?licence=eee”的连接,如果名称在客户数组,如果不是则“失败”。
通过 Stripe,当 webhook 被触发时,我可以看到我的工作人员的以下响应:“客户收到:eee 其他客户:demo、demo2、demo3、eee customers.includes(key):true”
这意味着新客户已成功添加到数组中,并且我的代码能够检查客户是否包含在数组中。
但是当用户尝试直接验证他们的名字时,只有在开头定义的数组内容,如“demo”、“demo2”得到肯定的响应。
谁能帮我解决这个问题?非常感谢。
addEventListener("fetch", (event) => {
event.respondWith(
handleRequest(event.request).catch(
(err) => new Response(err.stack, { status: 500 })
)
);
});
customers = ["demo", "demo2","demo3"];
/**
* @param {Request} request
* @returns {Promise<Response>}
*/
async function handleRequest(request) {
const { pathname } = new URL(request.url);
if (pathname.startsWith("/api")) {
return new Response(JSON.stringify({ pathname }), {
headers: { "Content-Type": "application/json" },
});
}
if (pathname.startsWith("/validate")) {
let params = (new URL(request.url)).searchParams;
let key = params.get('licence');
console.log(key);
if(customers.includes(key)){
return new Response("legit");
}
else {
return new Response("failed");
}
}
if (pathname.startsWith("/updateCustomers")) {
let clonedBody = await request.clone().json();
let newCustomerName = JSON.stringify(clonedBody.data.object.name);
let newCustomerNameRaw = newCustomerName.substring(1, newCustomerName.length-1);
customers.push(newCustomerNameRaw);
return new Response("Customers recievedd: " + newCustomerNameRaw + " Other Customers: " + customers.toString() + " customers.includes(key): " + customers.includes(newCustomerNameRaw) );
}
//fallback **strong text**not relevant
if (pathname.startsWith("/status")) {
const httpStatusCode = Number(pathname.split("/")[2]);
return Number.isInteger(httpStatusCode)
? fetch("https://http.cat/" + httpStatusCode)
: new Response("That's not a valid HTTP status code.");
}
return fetch("https://welcome.developers.workers.dev");
}
那是因为客户“demo”、“demo2”和“demo3”作为代码的一部分存储在 webworker 中,所以调用时它们随时都在。代码运行时,新客户只是暂时存储在数组中,但一旦执行结束,客户数组内容就会重置。如果你想在运行之间保留新客户,你将需要使用某种后端来存储客户
我为 Cloudflare 工作人员编写了这段代码。
当在 Stripe 上创建新客户时,会触发 webhook 并将新客户数据 return 发送到 [...].worker.dev/updateCustomers Cloudflare 工作人员然后将执行以下操作:
- 从客户JSON对象中获取名称
- 创建一个字符串周围没有“”的版本
- 将新客户添加到名为 customers[] 的数组中
- 出于调试原因,它将使用以下内容响应 Stripe:新客户名称、数组中的所有客户以及如果新客户名称包含在数组中的结果
如果用户打开到“https://[...]workers.dev/validate?licence=eee”的连接,如果名称在客户数组,如果不是则“失败”。
通过 Stripe,当 webhook 被触发时,我可以看到我的工作人员的以下响应:“客户收到:eee 其他客户:demo、demo2、demo3、eee customers.includes(key):true”
这意味着新客户已成功添加到数组中,并且我的代码能够检查客户是否包含在数组中。
但是当用户尝试直接验证他们的名字时,只有在开头定义的数组内容,如“demo”、“demo2”得到肯定的响应。
谁能帮我解决这个问题?非常感谢。
addEventListener("fetch", (event) => {
event.respondWith(
handleRequest(event.request).catch(
(err) => new Response(err.stack, { status: 500 })
)
);
});
customers = ["demo", "demo2","demo3"];
/**
* @param {Request} request
* @returns {Promise<Response>}
*/
async function handleRequest(request) {
const { pathname } = new URL(request.url);
if (pathname.startsWith("/api")) {
return new Response(JSON.stringify({ pathname }), {
headers: { "Content-Type": "application/json" },
});
}
if (pathname.startsWith("/validate")) {
let params = (new URL(request.url)).searchParams;
let key = params.get('licence');
console.log(key);
if(customers.includes(key)){
return new Response("legit");
}
else {
return new Response("failed");
}
}
if (pathname.startsWith("/updateCustomers")) {
let clonedBody = await request.clone().json();
let newCustomerName = JSON.stringify(clonedBody.data.object.name);
let newCustomerNameRaw = newCustomerName.substring(1, newCustomerName.length-1);
customers.push(newCustomerNameRaw);
return new Response("Customers recievedd: " + newCustomerNameRaw + " Other Customers: " + customers.toString() + " customers.includes(key): " + customers.includes(newCustomerNameRaw) );
}
//fallback **strong text**not relevant
if (pathname.startsWith("/status")) {
const httpStatusCode = Number(pathname.split("/")[2]);
return Number.isInteger(httpStatusCode)
? fetch("https://http.cat/" + httpStatusCode)
: new Response("That's not a valid HTTP status code.");
}
return fetch("https://welcome.developers.workers.dev");
}
那是因为客户“demo”、“demo2”和“demo3”作为代码的一部分存储在 webworker 中,所以调用时它们随时都在。代码运行时,新客户只是暂时存储在数组中,但一旦执行结束,客户数组内容就会重置。如果你想在运行之间保留新客户,你将需要使用某种后端来存储客户