2015-01-12 2 views
0

Я новичок в мире Nodejs. Я пытаюсь вставить данные в MongoDB с помощью Mongoose. Идея
- У меня будет сервер, работающий на узле - любые входящие данные POST будут сохранены в Mongo.Данные не сохраняются в MongoDB с использованием Mongoose

Проблема при запуске нижеследующего кода не сохраняется в MongoDB, а также не отображается ошибка. Я что-то пропустил. Любая помощь будет действительно оценена.

У меня есть код, который записывает данные в mongoDB для входящего HTTP-запроса.

var http = require('http') // http module 
, fs = require('fs') // file system module 
, qs = require('querystring') // querystring parser 
, mongoose = require('mongoose'); 

mongoose.connect("mongodb://localhost/app_data_db"); 
var db = mongoose.connection; 
var appDataSchema = new mongoose.Schema({ 

    record_id:  Number, 
    app_version: Number, 
    imei:   String, 
    created_time: Date, 
    device_uid:  String, 
    model:   String 
}); 

var appDataModel = mongoose.model("app_data_collection",appDataSchema); 

var PORT=8080; 

http.createServer(function(req,res){ 

if(req.method == "POST") { 
    var POST = {}; 
    //parse query string 
    req.on('data', function(data) { 
     data = data.toString(); 
     data = data.split('&'); 
     for (var i = 0; i < data.length; i++) { 
      var _data = data[i].split("="); 
      POST[_data[0]] = _data[1]; 
     } 

     db.once('open', function (callback) { 
      appDataModel.create({ 
        record_id:  POST["id"], 
        app_version: POST["app_version"], 
        imei:   POST["imei"], 
        created_time: new Date((parseInt(POST["created_time"]) + 19800) *1000), // to set correct time zone IST 
        device_uid:  POST["device_uid"], 
        model:   POST["model"] 

       }); 
     }); 
     res.writeHead(200, {'Content-Type': 'text/plain'}); 
     res.end('saved to DB:'+POST["id"]+'\n'); 
     console.log('saved to DB:'+POST["id"]+'\n'); 
    }); 
    mongoose.disconnect(); 
} 


}).listen(PORT); 

Чтобы проверить это, я вручную стреляя этот локон вызов:

curl -X POST --data "id=58648148&app_version=4.8&imei=355886053224492&created_time=1417372202&device_uid=e385c8a5a4c01304&model=GT-I9082" http://localhost:8080 
+1

Вы создаете модель, но не сохраняете ее в БД. –

ответ

2

Есть пара проблем с кодом:

1) вы называете mongoose.disconnect вне обратного вызова, что означает, что он вызывается перед выполнением обратного вызова

2) вы создаете модель внутри обратного вызова, но отправляете ответ за ее пределами, поэтому ответ отправляется до модель создается

3) и, наконец, create метод обеспечивает функцию обратного вызова, когда объект будет сохранен в БД, которые вы не используете его все

Вот измененный код:

mongoose.connect("mongodb://localhost/app_data_db"); 
db.on('open', function() { 
    http.createServer(function(req, res) { 

     if(req.method == "POST") { 
      var POST = {}; 
      //parse query string 
      req.on('data', function(data) { 
       data = data.toString(); 
       data = data.split('&'); 
       for (var i = 0; i < data.length; i++) { 
        var _data = data[i].split("="); 
        POST[_data[0]] = _data[1]; 
       }  

       appDataModel.create({ 
        record_id:  POST["id"], 
        app_version: POST["app_version"], 
        imei:   POST["imei"], 
        created_time: new Date((parseInt(POST["created_time"]) + 19800) *1000), // to set correct time zone IST 
        device_uid:  POST["device_uid"], 
        model:   POST["model"]   
       }, 
       function(err){ 
        res.writeHead(200, {'Content-Type': 'text/plain'}); 
        res.end('saved to DB:'+POST["id"]+'\n'); 
        console.log('saved to DB:'+POST["id"]+'\n'); 
        mongoose.disconnect(); 
       });      
      });  
     }   
    }).listen(PORT); 
}); 
+0

Получил больше советов о том, как использовать nodejs. Благодаря! но я попробовал вышеуказанный код, но он все еще не работает. После ввода команды curl нет выхода. – vsingh

+0

@vsingh Я обновил код, попробую сейчас (я использовал открытое событие db и переместил создание сервера на его обратный вызов) –

+0

@@ Vsevolod. Спасибо, что помогли здесь. Это еще одна проблема. Первый завиток сохраняет данные, но последовательные вызовы не сохраняются. Последовательные вызовы просто зависают без вывода. – vsingh

0

Думаю, у меня это получилось. Я переместил соединение мангуста внутри. Остальное все одинаково. Так как я хотел опубликовать код, отвечая вместо комментария. Это может помочь другим. Вот полный код

var http = require('http') // http module 
    , fs = require('fs') // file system module 
    , qs = require('querystring') // querystring parser 
    , mongoose = require('mongoose'); 

var appDataSchema = new mongoose.Schema({ 
     record_id: Number, 
     app_version: Number, 
     imei: String, 
     created_time: Date, 
     device_uid: String, 
     model: String 
    }); 

var appDataModel = mongoose.model("app_data_collection", appDataSchema); 

var PORT = 8080; 

http.createServer(function(req, res) { 

    if (req.method == "POST") { 

     var POST = {}; 
     //parse query string 
     req.on('data', function(data) { 
      data = data.toString(); 
      data = data.split('&'); 
      for (var i = 0; i < data.length; i++) { 
       var _data = data[i].split("="); 
       POST[_data[0]] = _data[1]; 
      } 

      mongoose.connect("mongodb://localhost/app_data_db"); 
      var db = mongoose.connection; 

      db.on('error', console.error.bind(console, 'connection error:')); 

      db.once('open', function() { 
       appDataModel.create({ 
       record_id: POST["id"], 
       app_version: POST["app_version"], 
       imei: POST["imei"], 
       created_time: new Date((parseInt(POST["created_time"]) + 19800) * 1000), // to set correct time zone IST 
       device_uid: POST["device_uid"], 
       model: POST["model"] 

      }, function(err) { 
       res.writeHead(200, {'Content-Type': 'text/plain'}); 
       res.end('saved to DB:' + POST["id"] + '\n'); 
       console.log('saved to DB:' + POST["id"] + '\n'); 
       mongoose.disconnect(); 
      }); 
     }); 
    }); 
    } 

}).listen(PORT); 
Смежные вопросы