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.