2017-01-23 9 views
0

この単純なNode.js Express APIを作成すると、奇妙な問題が発生しました。 モデルを作成し、データを挿入してからMongoDBに保存します。しかし、記録は決して保存されませんが、私もエラーはありません。私はMongoDBが実行されているかどうか、またノードエラーのsyslogとMongoDBエラーのmongod.logと私自身のWilsonのdebug.logファイルをチェックしました。すべてエラーを含まない。Node.jsエラーなしでMongooseモデルが保存されない

私はAPIをテストするためにpostmanを使用し、毎回レスポンスを取得します。データがMongoDBに保存されないだけです(挿入されたレコードを調べるためにdb.collection.find()でmongoコンソールを使用しました)。

これはなぜ起こっているのでしょうか?

私のコード:

api.js

var express = require('express'); 
var app  = express(); 
var bodyParser = require('body-parser'); 
var http  = require('http'); 
var https  = require('https'); 
var fs   = require('fs'); 
var winston = require('winston'); 

// Configure logging using Winston 
winston.add(winston.transports.File, { filename: '/home/app/api/debug.log' }); 
winston.level = 'debug'; 

// Request body parser 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

// Enable https 
var privateKey = fs.readFileSync('path to private key'); 
var certificate = fs.readFileSync('path to cert file'); 

var credentials = { 
    key: privateKey, 
    cert: certificate 
}; 

// ROUTERS 
var router = express.Router(); 

var speciesRouter = require('./app/routes/speciesRouter'); 
router.use('/species', speciesRouter); 

// Routes prefix 
app.use('/api/v1', router); 

// SERVER STARTUP 
http.createServer(app).listen(3000); 
https.createServer(credentials, app).listen(3001); 

speciesRouter.js

var express = require('express'); 
var mongoose = require('mongoose'); 
var router = express.Router(); 
var Sighting = require('../models/sighting'); 
var winston = require('winston'); 

// Database connection 
var dbName = 'dbname'; 
mongoose.connect('mongodb://localhost:27017/' + dbName); 
var db = mongoose.connection; 
db.on('error', function(err){ 
    winston.log('debug', err); 
}); 

router.route('/') 

.post(function(req, res) { 

    var sighting = new Sighting(); 
    sighting.user_key = req.body.user_key; 
    sighting.expertise = req.body.expertise; 
    sighting.phone_location = req.body.phone_location; 
    sighting.record_time = req.body.record_time; 
    sighting.audio_file_location = '/var/data/tjirp1244123.wav'; 
    sighting.probable_species = [{species_name:'Bosaap', percentage:100}]; 

    var error = ''; 
    winston.log('debug', 'test'); 

    // This does not get execute I suspect.. 
    sighting.save(function(err) { 
    winston.log('debug', 'save'); 
    if (err) { 
     winston.log('debug', err); 
     error = err; 
    } 
    }); 

    res.json({ 
    probable_species: probable_species, 
    expertise: req.body.expertise, 
    error: error 
    }); 
}); 

module.exports = router; 

sighting.js(モデル)

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var SightingSchema = new Schema({ 
    user_key: String, 
    expertise: Number, 
    phone_location: { lat: Number, lng: Number }, 
    record_time: Number, 
    audio_file_location: String, 
    probable_species: [{ species_name: String, percentage: Number }] 
}); 

module.exports = mongoose.model('Sighting', SightingSchema); 
+0

winston.log( 'debug'、 'save');これは何かを印刷しますか? –

+0

これは私のカスタムログファイルに入れます。その行には到達しませんが、sighting.save()行の前に別のwinstonログを入れます。 –

+0

db.calculations.find()とdb.sightings.count()をチェックしました。最初のものは空で、2番目のものは0を返しました。 –

答えて

1

を完了するために、機能を保存するのを待たずに実行されますので、

return sighting.save().then(function(data){ 
    console.log(data); // check if this executes 
    return res.json({ 
     probable_species: probable_species, 
    expertise: req.body.expertise, 
    error: error 
    }); 
}).catch(function(err){ 
    console.log(err); 
}); 

もう一つは、あなたがあなたのMongoDBを更新しようとしたの機能を保存する外res.json使用してはいけません。

sudo npm update 
+0

これはうまくいきました。私はmongooseのバージョン番号を私の_package.json_の最新バージョンに変更し、 'sudo npm update'を実行しました。 –

0

あなたが約束を使用して試すことができます。非同期コードで、それはその実行

+0

これは私に型エラーです:未定義のプロパティ 'then'を読み取ることができないので、今私はインスタンス化したモデルのwhatsを調べています。 res.jsonについてのヒントのTy! –

+0

視覚には正しいモデルが含まれているので、上記のタイプのエラーがスローされる理由についてはわかりません。 –

+0

sighting.save()の前に戻りません。 –

関連する問題