Нello!Я пытаюсь вызвать функцию, которая была передана в expressRouter.post(...)
вызов.
Этот expressRouter.post(...)
вызов происходит в файле, который я не могу изменить .Код уже был распространен среди многих клиентов, и я не могу изменить их версии файла.В то время как I не имеет возможности обновить этот файл для удаленных клиентов, другие разработчики могут .Поэтому я сталкиваюсь с проблемой изменения поведения конечной точки POST в будущем.
Я также имею дело с проблемами производительности.Эта конечная точка POST ожидает, что req.body
будет проанализированным объектом JSON, и этот объект JSON может быть чрезмерно большим.
Моя цель - написать конечную точку GET, которая внутренне активирует эту конечную точку POST.Конечной точке GET потребуется вызвать конечную точку POST с очень большим значением JSON, в которое вставлены параметры URL-запроса.Функциональность GET всегда должна отражать функциональность POST, в том числе, если функциональность POST будет обновлена в будущем.По этой причине я не могу скопировать / вставить логику POST.Обратите также внимание на то, что формат JSON никогда не изменится.
Я понимаю, что проблема вызова конечной точки expressjs внутри системы обычно решается с помощью 1) извлечения функции маршрутизатора в доступную область действия ,или 2) генерация HTTP-запроса к localhost .
К сожалению, в моем случае ни одна из этих опций не подходит:
- Я не могу переместить функцию вдоступной области видимости, поскольку я не могу изменить источник, а также не могу скопировать и вставить функцию, так как оригинальная версия может измениться
- Избегание HTTP-запроса является высоким приоритетом из соображений производительности.HTTP-запрос потребует сериализации + десериализации чрезмерно большого тела JSON, повторного посещения ряда промежуточных программ аутентификации (которые требуют ожидания дальнейших HTTP-запросов + запросов к базе данных) и т. Д.
Вот мой(продолжение) Конечная точка POST:
expressRouter.post('/my/post/endpoint', (req, res) => {
if (!req.body.hasOwnProperty('val'))
return res.status(400).send('Missing "val"');
return res.status(200).send(`Your val: ${req.body.val}`);
});
Если я сделаю запрос POST для localhost:<port>/my/post/endpoint
, я получу ожидаемую ошибку или ответ, основанный на том, включил ли я "val" в тело JSON.
Теперь я хочу, чтобы у меня была точно такая же функциональность, но через GET и с указанием «val» в URL, а не в любом теле JSON.Я попытался сделать следующее:
expressRouter.get('/my/get/endpoint/:val', (req, res) => {
// Make it seem as if "val" occurred inside the JSON body
let fakeReq = {
body: {
val: req.params.val
}
};
// Now call the POST endpoint
// Pass the fake request, and the real response
// This should enable the POST endpoint to write data to the
// response, and it will seem like THIS endpoint wrote to the
// response.
manuallyCallExpressEndpoint(expressRouter, 'POST', '/my/post/endpoint', fakeReq, res);
});
К сожалению, я не знаю, как реализовать manuallyCallExpressEndpoint
.
Есть ли решение этой проблемы, которое исключает как извлечение функции в доступнуюобласть действия и создание запроса HTTP?