#node.js #async-await
#node.js #асинхронный-ожидание
Вопрос:
Мой массив «ошибки» (перенос кода **) не виден за пределами обещания, я хотел бы сделать его видимым либо с помощью метода asich / await, либо с помощью глобальной переменной. В контексте массив «errori» заключен между звездочками Благодаря
app.post('/costi/addcosto',accessoSicuro, (req,res)=>{
let errori = [ ];
//Salvo lo stato attuale dei dati modificati
let costo = {
valore: req.body.valore
};
//Salvo il valore scelto nella Select
listPredefiniti = [];
objpredefiniti = new Object();
objpredefiniti.predefiniti= req.body.descrizione
listPredefiniti.push(objpredefiniti);
//Fine Salvo il valore scelto nella Select
//*******************Rendere errori visibile all'esterno**********************************************
Costi.find({utente: req.user.id})
.then(costi => {
let testKeys = Object.keys(costi);
testKeys.forEach(function(k){
if (costi[k].descrizione == req.body.descrizione){
errori.push({text: 'La descrizione' req.body.descrizione 'è già presente, edita il valore esistente'});
}
});
});
//******************************************************************************************************
//Controllo sui caratteri costo
isValidCost = /^[0-9,.]*$/g.test(req.body.valore);
if (!isValidCost) {
errori.push({text:"Il campo costo deve contenere solo i caratteri: 0-9 '.' ',' "});
}
if(errori.length > 0){
res.render('costi/addcosto', {
errori: errori,
costo: costo,
listaPredefiniti:listPredefiniti
});
}
else{
//Se il costo viene inserito con la virgola lo converto in un punto
costoWithoutComma = req.body.valore;
costoWithoutComma = costoWithoutComma.replace(",", ".");
const nuovoCosto = {
descrizione: req.body.descrizione, //Inietto il valore descrizione selezionato e lo salvo nel modello
valore: costoWithoutComma,
utente: req.user.id
}
new Costi(nuovoCosto)
.save()
.then(costo =>{
req.flash('msg_successo','Costo aggiunto correttamente');
res.redirect('dbcosti');
})
}
});
//Fine route aggiungi costi
Комментарии:
1. Объявить
errori
вне маршрута. Как в начале файла.2. Он
errori
виден внутри и снаружи вашегоCosti.find
обещания, но обрабатываемый кодcosti
выполняется позже, чем код, следующий за ‘// Controllo sui caratteri costo’3. Нет, не работает путем объявления глобальной переменной, код внутри promise является асинхронным
Ответ №1:
Вместо объявления ошибки в область блокировки вы можете объявить ошибку в глобальную область, чтобы вы могли получить доступ к переменной errori в любом месте внутри async / await или вне async / await .
Комментарии:
1. Нет, не работает путем объявления глобальной переменной, код внутри promise является асинхронным