Массив не виден внутри обещания

#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 является асинхронным