Я использую выражение в Node.js, и я использую функцию внутри маршрута получения... Функция сначала реализует простую функцию кэширования с собственным кодом, а затем запрашивает некоторые данные из базы данных MSSQL и возвращает их в res.json (данные). Но я хотел бы реорганизовать свою функцию кэширования, поместить ее в собственную функцию и назвать ее промежуточным программным обеспечением Express. Но так или иначе, я пробовал много, но действительно не знаю, как это сделать. Ниже приведена моя переработанная функция checkTime().
router.get("/v1/watch/readindex", async function(req,res) {
///////////////////////////CASHING///////////////////////////////////
var timediff = config.get('write.cachetime'); //get cachetime - same for write or read
timediff = 30000; //testing
var timenow = Date.now();
if (!cachedtimeread || !readmsg || (cachedtimeread < (timenow-timediff))) {
readmsg = "";
cachedtimeread = timenow;
readtimemsg = `Zeit vergangen seit letztem Aufruf: ${msToTime(cachedtimeread -timenow)}. API wurde aufgerufen.\n<br>`;
}
else if (cachedtimeread >= (timenow - timediff)) { //API-Aufruf jünger als Aufrufzeitpunkt - timediff
readmsg += `Zeit vergangen seit letztem Aufruf: ${msToTime(cachedtimeread -timenow)}. Dokument ist aus dem Cache!\n<br>`;
//console.log("Funktion für Dokument-Query wurde nicht aufgerufen!");
res.set('Content-Type', 'text/html');
res.json(readmsg);
return;
}
//////////////////////////////////////////////////////////////////////
axios.all([read = await count_ES_read(), await mssqlQuery(mssqlQueryLessOneDay),
await mssqlQuery(mssqlQueryLessEightHours), await mssqlQuery(mssqlQueryTotal) ])
.then(axios.spread(function (resultES_read, mssqlLessOneDay, mssqlLessEightHours, mssqlTotal) {
readmsg='';
var elasticsearchcount = resultES_read.count;
var mssqlLessOneDay = mssqlLessOneDay.recordset[0].count;
var mssqlLessEightHours = mssqlLessEightHours.recordset[0].count;
var mssqlTotal = mssqlTotal.recordset[0].count;
//console.log(elasticsearchcount, mssqlLessOneDay, mssqlLessEightHours, mssqlTotal);
readmsg += `Umgebung: ${process.env.NODE_ENV} READ<br>`;
readmsg += `ES Dokumente insg: ${elasticsearchcount} MSSQL Dokumente insg: ${mssqlTotal} <br>`;
if ( elasticsearchcount < mssqlLessOneDay) {
readmsg += `Critical: ${mssqlLessOneDay - elasticsearchcount} , weniger Dokumente in ES als im Dokumente-Pool die älter als 1 Tag sind. <br>`;
} if ((elasticsearchcount < mssqlLessEightHours)) {
readmsg += `Warning: ${mssqlLessEightHours - elasticsearchcount} , weniger Dokumente in ES als im Dokumente-Pool, die älter als 8 Stunden sind. <br>`;
} if ((elasticsearchcount > mssqlTotal)) {
readmsg += `Achtung: ES-Dokumente Anzahl > Dokumente im Dokumente-Pool. Es gibt ${elasticsearchcount - mssqlTotal} ungelöschte Dokumente im Elasticsearch Index!`;
}
res.set('Content-Type', 'text/html');
res.json(readmsg);
})).catch((err) => {
res.send(err);
});
});
Эта функция должна получить вывод для сообщения из запроса к базе данных из последней асинхронной функции выше, если временная метка из последнего вызова API-маршрута все еще моложе некоторой временной метки в миллисекундах. Если это не так, должен быть выполнен последний вызов функции для извлечения данных. Но я не знаю, как получить переменную сообщения из асинхронной функции, сохранить ее в res.locals
как-то не получилось, и, более того, я не знаю, как тогда пропустить последний вызов функции. Почему-то возврат после res.json() в мидлваре не работает и асинхронная функция выполняется всегда, но я хочу выйти из функции checkTime() и вернуть сообщение в res.json, если документ моложе now-timestamp
.
function checkTime(writemsg) {
return function(req,res,next) {
var timediff = config.get('write.cachetime'); //get cachetime - same for write or read
timediff = 30000; //testing
var timenow = Date.now();
if (!cachedtimewrite || !writemsg || (cachedtimewrite < (timenow-timediff))) {
writemsg = "";
cachedtimewrite = timenow;
writetimemsg = `Zeit vergangen seit letztem Aufruf: ${msToTime(cachedtimewrite -timenow)}. API wurde aufgerufen.\n<br>`;
next();
}
else if (cachedtimewrite >= (timenow - timediff)) { //API-Aufruf jünger als Aufrufzeitpunkt - timediff
writemsg += `Zeit vergangen seit letztem Aufruf: ${msToTime(cachedtimewrite -timenow)}. Dokument ist aus dem Cache!\n<br>`;
//console.log("Funktion für Dokument-Query wurde nicht aufgerufen!");
res.set('Content-Type', 'text/html');
res.json( writemsg);
return;
}
}
}
router.get("/v1/watch/writeindex", checkTime(writemsg), async function(req,res,next) {
//////////////РЕДАКТИРОВАТЬ:
Одна из функций, которую я использую в Promise.all() для получения данных из БД, такова:
var mssqlQuery = (query) => {
if (!query || query =="") {
throw new Error('Query for MSSQL was not defined!');
}
//console.log("Query: ", query);
var conn = new sql.ConnectionPool(mssqlconfig);
var req = new sql.Request(conn);
return conn.connect().then(async() => {
var result = await req.query(query);
//conn.close();
return result;
//conn.close();
}).catch(e => {
return e;
}).finally(() => {
conn.close();
});
}