簡體   English   中英

數據未使用Mongoose保存在MongoDB中

[英]Data not saving in MongoDB using Mongoose

我是Nodejs世界的新手。 我正在嘗試使用Mongoose在MongoDB中插入數據。 這個想法是
-我將在節點上運行服務器-任何傳入的POST數據都將保存在Mongo中。

當運行以下代碼時,沒有數據保存在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調用:

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)您在回調之外調用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);
});

我想我已經做到了。 我已經將貓鼬連接移到了里面。 休息都一樣。 由於我想發布代碼,因此回答而不是評論。 這可能會幫助其他人。 這是完整的代碼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM