Tengo un tablero angularjs donde se supone que el usuario debe completar un formulario (dando una identificación y una fecha) y luego estos datos se envían a un servidor express / nodejs que realiza una consulta a un mongodb.

Mi problema es que si el usuario completa una ID que no existe en la base de datos, mongodb devolverá un error "no se puede leer el recuento de propiedades de indefinido" y el servidor express se bloqueará.

He intentado manejar el error con un try / catch pero nada cambia.

try {
            collection
            .aggregate(
              [{$match: {"content.MemberID_Hash": "xxx", "content.Swipe_DateTime": {$regex:"201602"}}},
              {$group: {_id: null, count:{$sum: 1}}}],
              function(err,result) {
                  console.log("User's number of swipes from last month: ", result[0].count);
                  //findUserRank(result[0].count);
                  //getNeighbouringValues(result[0].count);
              });
        } catch (err) {console.log("Wrong query"); console.error(err);}

¿Hay alguna manera de que pueda devolver un error mientras mantengo el servidor en funcionamiento?

0
KeykoYume 27 dic. 2016 a las 11:52

3 respuestas

La mejor respuesta

Su código es asíncrono, por lo que try / catch no funcionará. El error de programación debe validarse antes de su uso. el resultado [0] está intentando acceder aunque no exista

 collection.aggregate(
                  [{$match: {"content.MemberID_Hash": "xxx", "content.Swipe_DateTime": {$regex:"201602"}}},
                  {$group: {_id: null, count:{$sum: 1}}}],
                  function(err,result) {
                      if(err){
                        throw err ;
                      }
                      if(result && result[0]){
                            console.log("User's number of swipes from last month: ", result[0].count);
                           //findUserRank(result[0].count);
                           //getNeighbouringValues(result[0].count);
                      }

                  });
2
Sumeet 27 dic. 2016 a las 09:21

Para evitar este error, debe redirigir su salida en una colección temporal, con la etiqueta $out

De la siguiente manera:

{$out: "temporaryCollection"}

El temporaryCollection se creará en su base de datos

Aquí puede encontrar una documentación MongoDB sobre $out

1
Joe Taras 27 dic. 2016 a las 09:20
        collection
        .aggregate(
          [{$match: {"content.MemberID_Hash": "xxx", "content.Swipe_DateTime": {$regex:"201602"}}},
          {$group: {_id: null, count:{$sum: 1}}}],
          function(err,result) {
              if(err){
                 console.log(err);
                 return;
               }
              else{
              console.log("User's number of swipes from last month: ", result[0].count);
             }
              //findUserRank(result[0].count);
              //getNeighbouringValues(result[0].count);
          });

Intente esto si resuelve su error.

1
S. Jashoria 27 dic. 2016 a las 09:41