2017-01-23 46 views
0

製作這個簡單的Node.js Express API我遇到了一個奇怪的問題: 我正在創建一個模型並向其中插入數據,然後將其保存到我的MongoDB中。但是這個記錄永遠不會被保存,但我也不會有任何錯誤。我已經檢查過MongoDB是否正在運行,並且syslog中的Node錯誤和mongod.log中的MongoDB錯誤以及我自己的Wilson debug.log文件。全部不包含錯誤。Node.js Mongoose模型不存儲沒有錯誤

我使用郵遞員來測試API並且每次都得到響應。只是數據沒有保存到MongoDB中(我使用mongo控制檯和db.collection.find()來檢查插入的記錄)。

任何想法爲什麼會發生這種情況?

我的代碼:

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()。第一個是空的,第二個返回0. –

回答

1

你嘗試更新您的MongoDB。

sudo npm update 
+0

這個工作,我改變了我的_package.json_最新的貓鼬版本號,然後運行'sudo npm update'。 –

0

您可以嘗試使用的承諾。

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

一件事不使用res.json保存功能之外,因爲在異步代碼將無需等待運行保存功能完成執行

+0

這給了我TypeError:不能讀取未定義的屬性'然後',所以現在我正在調查我實例化的模型中有什麼。 Ty關於res.json的提示! –

+0

瞄準確實包含正確的模型,所以我不知道爲什麼它會拋出上面提到的錯誤類型。 –

+0

在沒有返回之前試試它sighting.save() –

相關問題