Чтобы уйти от этого: я не публикую ошибку в этом вопросе!
Проблема
Я недавно нашелпроблема с моим внутренним кодом Node.js и Express при одновременном выполнении нескольких запросов от внешнего интерфейса.Давайте предположим, что одна из моих конечных точек выглядит так:
var payload, id1, id2, data1, data2
exports.someFunction = async (req, res) => {
payload = req.body.payload
id1 = req.params.id1
id2 = req.query.id2
try {
data1 = await fetchData1()
data2 = await fetchData2()
return responseHandler.success({ data1, data2 })
} catch (err) {
return responseHandler.error(err)
}
}
async function fetchData1() {
return new Promise((resolve, reject) => {
// fetch data from database by accessing
// payload, id1, id2
// here
})
}
Проблема, которую я обнаружил, заключалась в том, что глобальные переменные, такие как payload
, id1
и т. Д., Были перезаписаны во время выполнения асинхронных функций.(Если следующий запрос сделан до того, как первый закончен). Таким образом, некоторые функции были выполнены с неправильными входными данными и появились странные ответы.
Решение
Тогда я решил:переместите эти глобальные переменные в функцию, что привело к интенсивному использованию аргументов функции:
exports.someFunction = async (req, res) => {
const payload = req.body.payload
const id1 = req.params.id1
const id2 = req.query.id2
try {
const data1 = await fetchData1(payload, id1, id2)
const data2 = await fetchData2(payload, id1, id2, data1)
return responseHandler.success({ data1, data2 })
} catch (err) {
return responseHandler.error(err)
}
}
async function fetchData1(payload, id1, id2) {
return new Promise((resolve, reject) => {
// fetch data from database
})
}
Как вы можете видеть, код становится очень запутанным, что на самом деле стало причиной того, что я использовал глобальные переменные в первойplace.
Мои актуальные вопросы
- (1) Глупо ли использовать «глобальные переменные» в экспресс-маршрутах?
- (2) Есть ли лучший способ предоставления данных другим функциям, а не вводить все аргументы каждый раз
- (3) Верна ли моя гипотеза, что эти "глобальные переменные" перезаписываются при новом запросезвонит по этому конкретному маршруту?