Или у меня проблема с пониманием вашего вопроса, или вы не совсем понимаете, как работает промежуточное программное обеспечение Express.
function checkTime(writemsg) {
return function(req,res,next) {
if(foo) {
req.storeValueKey = 'data to store'
next(); // run next middleware
} else {
res.json('stop processing');
}
}
}
router.get('/url',checkTime('message'), (req, res) => {
console.log('data form middleware', req.storeValueKey)
res.json('send data collected from DB' + req.storeValueKey);
req.session.storeValueForNextRequests = 'val';
})
// EDIT BEGIN
В промежуточном ПОВы можете использовать next()
или res.send()
.Ошибочно использовать оба.И вы должны помнить, что использование next()
и res.send()
не прерывает выполнение родительской функции.(помните про return
)
res.send('Text response');
next();
thisIsAlsoRun();
И вы знаете, в вашем промежуточном программном обеспечении есть "черная дыра".Если оба if
false
вы застряли в промежуточном программном обеспечении, поэтому добавьте else next()
, чтобы избежать этого
// EDIT END
Кроме того, меня беспокоитвопрос: почему вы используете HTTP-клиент для сбора данных из обещаний и почему вы используете await там?
Узел должен делать это один за другим, а не асинхронно.(Если это не умнее и игнорировать этот неправильный синтаксис).
В начале, прекратите использовать await
в Promise.all
.
Затем используйте native Promises
вместо тех,из Axios http-клиент.
Promise.all([count_ES_read(),mssqlQuery(mssqlQueryLessOneDay),
mssqlQuery(mssqlQueryLessEightHours), mssqlQuery(mssqlQueryTotal) ])
.then(function (resultES_read, mssqlLessOneDay, mssqlLessEightHours, mssqlTotal) {
req.storeValueKey ;
})
// Edit 2
Я вижу, что у вас огромные проблемы с пониманием async/await
и Promisses
.Узел основан на событиях (например, получение результатов)
Очень обобщенно await
означает: " Подождите, пока вы продолжите выполнять функцию, пока не получите результаты. " И Promisses
:« создайте канал, который будет обрабатывать then
и обрабатывать инструкции далее .»
Смысл использования Promise.all()
заключается в том, что вы помещаете Promisess туда.Но вы формируете выполнение, используя await
const mssqlQuery = (query) => {
if (!query || query =="") {
throw new Error('Query for MSSQL was not defined!');
}
//I will not investigate whether you are doing well making a call with each request.
const conn = new sql.ConnectionPool(mssqlconfig);
const req = new sql.Request(conn);
return conn.connect().then(() => {
// Promise can return promise
let result = req.query(query);
conn.close();
return result;
});
}
const mssqlNoErrorQuery = (query) => {
return mssqlQuery(query).catch( e => {
return null; // no results
// OR fake resultset count
return {recordset:[{count:null}]};
/*
return e; // this will cause the error in the next stage
//to be treated as a correct situation.
// Next you should take care of it in such a way:
let res = await mssqlQuery(query);
if(res instanceof Error)
console.error('something wrong')
else
res.recordset[0].count
*/
});
}
let [res1, res2] = await Promise.all([
mssqlNoErrorQuery(query1),
mssqlQuery(query2).catch(e =>{/* local error handling */})
])
Чтобы лучше понять всю идею, вам следует провести несколько экспериментов с этим кодом:
function sleep(ms){
return new Promise(resolve=>{
setTimeout(resolve,ms)
})
}
function wait(msg) {
return new Promise(async(resolve) => {
console.log('START '+ msg)
await sleep(700)
console.log('finish '+ msg)
resolve(true)
} )
}
let fo = async () => {
Promise.all([await wait('d'), await wait('e'), await wait('f')]).then((c,d,e)=> {console.log('collect CDE')})
Promise.all([wait('a'),wait('b'),wait('c')]).then((c,d,e)=> {console.log('collect ABC')})
}
fo();
результат:
START d 12:22:06 PM
finish d 12:22:07 PM
START e 12:22:07 PM
finish e 12:22:07 PM
START f 12:22:08 PM
finish f 12:22:08 PM
START a 12:22:08 PM
START b 12:22:08 PM
START c 12:22:08 PM
collect CDE
finish a 12:22:09 PM
finish b 12:22:09 PM
finish c 12:22:09 PM
collect ABC
Кстати: вы заметили, что процесс a, b, c начался до сбора результатов с c, d, e?
Теперь измените на:
let fo = async () => {
Promise.all([wait('a'),wait('b'),wait('c')]).then((c,d,e)=> {console.log('collect ABC')})
Promise.all([await wait('d'), await wait('e'), await wait('f')]).then((c,d,e)=> {console.log('collect CDE')})
}
Результат:
START a
START b
START c
START d
finish a
finish b
finish c
finish d
collect ABC
START e
finish e
START f
finish f
collect CDE
Как вы видите здесь, все обещания начинаются с 1 звонка и подходят от второго звонка