2017-08-12 1 views
-1

tous. Je suis nouveau sur Node.js et j'ai beaucoup de problèmes. J'essaye de créer un filtre via une fonction (une requête pour MongoDB à partir d'un JSON). Une fois cela fait, j'appelle une autre fonction qui doit vérifier si un filtre est présent dans la BD, si c'est le cas, le mettre à jour, sinon l'insérer. Soyons simples: ajoutons-le simplement, sans mise à jour s'il est déjà présent.UnhandledPromiserejectionAttention (rejet ID: 2)

Contrôleur

exports.create_filter = function(req, res) { 
/* 
Example JSON 
[ 
    { 
     name: "campo1", 
     operator: ">", 
     value "666" 
    }, 
    ... 
] 

    Example final filter 
    { properties: {$elemMatch : {gravity : {$gt: 3}, estimatedTime : {$gt: 3}, msg: {$regex: "sec"}}}} 
*/ 

const filter = req.body.filter; 
var obj = {}; 
var obj_key = 'properties'; 
obj[obj_key] = []; 
if(filter !== "") { 
    var query = '{$elemMatch : {' ; 
    filter.forEach(function(i, idx, table) { 
     if(i.operator == "contains") 
      query += i.name + ": { $regex: '"+ i.value + "'} "; 
     else { 
      switch(i.operator) { 
       case ">": 
        i.operator = '$gt: '; 
        break; 
       case ">=": 
        i.operator = '$gte: '; 
        break; 
       case "<": 
        i.operator = '$lt: '; 
        break; 
       case "<=": 
        i.operator = '$lte: '; 
        break; 
      } 
      query +=i.name + ": {" + i.operator + i.value + "} "; 
     } 
    if(idx !== table.length - 1) 
     query += ', '; 
    }); 
    query += '}'; 
obj[obj_key].push(query); 
res.json(JSON.stringify(obj)); 
return JSON.stringify(obj); 
} 
}; 

exports.add_filter = function(filter_to_add, email) { 
console.log("*** ADD FILTER ***"); 
return new Promise((resolve,reject) => { 
    var filters = Filter.find({email: email}); 
    if (filters.length == 0) { 
     var filter = new Filter ({ 
      email: email, 
      filter: filter_to_add 
     }); 
     console.log(filter); 
     filter.save() 
      .then(() => resolve({ status: 200, message: 'Filter Registered Successfully!' })) 
      .catch(() => reject({ status: 500, message: 'Internal Server Error!' })); 
    } 
}) 
}; 

Route

app.post('/add_filter', (req, res) => { 

    const filt = project.create_filter(req, res); 
    const email = req.body.email; 
    MSAProject.add_filter(filt, email) 
    .then(result => { 
     res.status(result.status).json({ message: result.message })}) 
    .catch(err => res.status(err.status).json({ message: err.message })) 
    } 
); 

Modèle

// Filter schema for mongoDB 
var FilterSchema = new mongoose.Schema({ 
    email: {type: String, unique: true, required: true}, 
    filter: {type: String, unique: true, required: true} 
}); 

var UserSchema = new mongoose.Schema({ 

userName: {type: String, unique: true, required: true}, 
email: {type: String, unique: true, required: true}, 
password: {type: String, required: true}, 
createdAt: {type: String, required: true} 
}); 

var Filter = mongoose.model('Filter', FilterSchema); 
var Topic = mongoose.model('Topic', TopicSchema); 

module.exports = Filter; 
module.exports = Topic; 

Mais quand je l'utilise PostMan et envoyer le JSON suivant:

{ 
    "email" : "[email protected]", 
    "filter": 
    [ 
     { 
      "name": "estimatedTime", 
      "operator": ">=", 
      "value": 666 
     }, 
     { 
      "name": "msg", 
      "operator": "contains", 
      "value": "sec" 
     } 
    ] 
} 

PostMan répond correctement pour "create_filter" avec le

"{\"properties\":[\"{$elemMatch : {estimatedTime: {$gte: 666} , msg: { $regex: 'sec'} }\"]}" 

puis, il entre dans "add_filter" et sur la console apparaît

UnhandledPromiseRejectionWarning (rejection id:2): Error: Can't set headers after they are sent

Merci.

Répondre

1

Résolu! res.json() appelle res.end() pour qu'il ne soit pas accessible dans la fonction suivante. :)