2017-08-12 9 views
-1

すべて。 私はNode.jsを使い慣れておらず、多くの問題を抱えています。 私は関数(JSONからMongoDBのクエリ)を介してフィルタを作成しようとしています。 これを行うと、フィルタがDBに存在するかどうかをチェックする必要がある別の関数を呼び出します(更新する場合はそれを挿入します)。 簡単にしましょう:既に存在する場合は、更新せずに追加しましょう。処理されていない承認通知(却下ID:2)

コントローラ

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!' })); 
    } 
}) 
}; 

ルート

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 })) 
    } 
); 

モデル

// 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; 

しかし、私は郵便配達を使用して送信するとき以下のJSON:

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

郵便配達員が、その後

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

で "create_filter" に対して正しく答えは、それが "ADD_FILTER" に入り、コンソール上

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

感謝を表示されます。

答えて

1

解決済み! res.json()はres.end()を呼び出し、次の関数でアクセスできないようにします。 :)

関連する問題