【发布时间】:2022-02-17 17:04:04
【问题描述】:
我希望对 ExpressJs 的请求进行排队,以便一次在端点上只处理一个请求。我发现了一些这样的例子:ExpressJS backend put requests into a queue
似乎它们需要为每个端点提供一个单独的函数。我正在尝试创建一个函数,该函数允许我传递队列名称,然后在指定队列中堆叠项目。
它是一个监听请求的 API,在收到请求后,将向另一个在线 API 执行请求,然后通过原始 express 端点将结果转发回用户。最终,我会为每个端点添加一些非常基本的缓存,只是为了在过期前存储一个简短的 JSON 字符串 3 秒。这样它会在 3 秒的限制内返回缓存的字符串,而不是再次从在线获取数据。
据我所知,我很想知道是否有更好的方法:
//UI request -> check cache -> return response || call request then return response
// Queue items on endpoint
class QueueUnique {
func;
q;
requestCache = [];
constructor(func) {
this.q = Promise.resolve();
this.func = func;
}
add(request) {
// Fetch all cached items related to the current endpoint queue
const cachedItem = this.requestCache.find(
(itm) => itm.queueName === request.queueName
);
// If the current request is within X seconds of the last successful requesst, return the cache
// otherwise make a new request
if (cachedItem && new Date().getTime() - cachedItem.runtime > 3000) {
console.log(
"Cache is over 3 seconds old. Doing new request. Queue name: " +
request.queueName
// no cahe, forward request:
//seperate this in to function
//res.sendResponse = res.send
// res.send = (body) => {
// request.body = body
// this.updateCache(request);
// res.sendResponse(body)
//}
//next()
);
this.updateCache(request);
} else if (cachedItem) {
console.log("Valid cache, return cache");
// res.send(request.body)
this.updateCache(request);
} else {
console.log("no cache");
//continue as normal as if no cache
// no cahe, forward request: Same as first run
this.addToCache(request);
}
// Do I need to use await before setting datetime?
//then cache
// Set the current time as a value in the item Array
request.runtime = new Date().getTime();
const queuedFunc = this.queue(request);
queuedFunc();
}
addToCache(request) {
// Add the new item to the permanent cache
this.requestCache.push(request);
}
updateCache(request) {
// Update the permanent request cache entry
const arrayIndex = this.requestCache.findIndex(
(itm) => itm.queueName === request.queueName
);
this.requestCache[arrayIndex] = request;
}
queue(item) {
return () => {
this.q = this.q
.then(() => this.func(item))
.catch((err) => {
console.log(err);
});
return this.q;
};
}
}
const response = (item) => {
return new Promise((resolve) => {
setTimeout(() => {
console.log("say", item.payload);
resolve();
}, item.delay);
});
};
const queue = [];
function test(bar, payload) {
if (!queue[bar]) {
queue[bar] = new QueueUnique(response);
}
queue[bar].add(payload);
console.log(queue);
return queue;
}
test("te", {
queueName: "ping",
payload: "one",
delay: 3000,
});
test("te", {
queueName: "ping",
payload: "one",
delay: 3000,
});
test("te", {
queueName: "ping",
payload: "one",
delay: 3000,
});
test("te2", {
queueName: "ping",
payload: "two",
delay: 1000,
});
test("te2", {
queueName: "ping",
payload: "two",
delay: 1000,
});
【问题讨论】:
标签: java typescript express