Могу ли я использовать app.use внутри app.get с разными путями - PullRequest
0 голосов
/ 09 января 2019

У меня есть этот бит кода, который принимает последние 10 URL-запросов в пути '/ img' и помещает его в массив, а затем у меня есть два условия. Если длина массива уже равна 10, удалите последний индекс и добавьте новый в начало списка. И другое, если индекс url уже находится в массиве, удалите этот, так что у меня нет повторяющихся URL в этом списке. Вот код:

let recentPaths = [];

app.use('/img', (req, res, next) => {
const index = recentPaths.indexOf(req.originalUrl);
if (recentPaths.length === 10) {
recentPaths.pop();
}
if (index !== -1) {
  recentPaths.splice(index, 1);
}
recentPaths.unshift(req.originalUrl);
next();
});

и затем у меня есть функция get, в которой я хочу получить данные из этого массива. Вот код:

app.get('/stats/paths/recent' ,sendRecentPaths);
async function sendRecentPaths(req, res) {
  res.json(recentPaths);
}

Это работает, но мой вопрос, могу ли я сделать этот первый блок кода внутри этой функции get? Я имею в виду, могу ли я использовать app.use () внутри app.get ()? Потому что я хочу, чтобы запрос из пути '/ img' отправлялся в массиве по пути '/stats/paths/recent'.

1 Ответ

0 голосов
/ 09 января 2019

Неправильно ставить app.use внутри app.get, поскольку промежуточное ПО должно быть определено один раз, а не при каждом запросе.

Если целью является обмен данными между промежуточными программами, которые выполняются в рамках одного запроса, они должны обмениваться данными через объект ответа :

res.locals

Объект, содержащий локальные переменные ответа, ограниченные областью запрос, и, следовательно, доступны только для представления (ов), представленных во время этот цикл запроса / ответа (если есть). В противном случае это свойство идентичен app.locals.

Это свойство полезно для предоставления информации уровня запроса, такой как имя пути запроса, аутентифицированный пользователь, настройки пользователя и т. д.

т.е. массив можно назначить промежуточному программному обеспечению res.locals.recentPaths и прочитать в другом промежуточном программном обеспечении. Проблема в этом случае заключается в том, что промежуточные программы /img и /stats/paths/recent не выполняются в рамках одного запроса.

Неправильно хранить данные в переменной recentPaths, поскольку она сохраняется между запросами и является глобальной для всех пользователей. Если данные должны сохраняться между запросами и быть специфичными для пользователей, это должно включать управление сеансами, лучшее место для хранения данных - это база данных, а не переменная.

...