2017-01-23 3 views
0

Mit dieser einfachen Node.js Express-API habe ich ein seltsames Problem festgestellt: Ich erstelle ein Modell, füge Daten ein und speichere es in meiner MongoDB. Aber der Datensatz wird nie gespeichert, aber ich bekomme auch keinen Fehler. Ich habe überprüft, ob MongoDB läuft und sowohl syslog für Knotenfehler und mongod.log für MongoDB-Fehler als auch meine eigene Wilson debug.log-Datei. Alle enthalten keine Fehler.Node.js Mongoose-Modell speichert nicht ohne Fehler

Ich benutze Postman, um die API zu testen und bekomme jedes Mal eine Antwort. Es ist nur so, dass die Daten nicht in MongoDB gespeichert werden (Ich habe die Mongo-Konsole mit db.collection.find() verwendet, um nach eingefügten Datensätzen zu suchen).

Eine Idee, warum das passieren könnte?

mein Code:

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 (Modell)

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', 'speichern'); das druckt etwas? –

+0

Dies bringt es in meine benutzerdefinierte Protokolldatei, ja. Diese Linie wird nie erreicht, jedoch wird ein anderes Winston-Protokoll erstellt, bevor die sighting.save() -Zeile erreicht wird. –

+0

Ich überprüft db.calculations.find() sowie db.stignings.count(). das erste war leer, das zweite gab 0 zurück. –

Antwort

1

abzuschließen Haben Sie Ihren mongodb versuchen zu aktualisieren.

sudo npm update 
+0

das funktionierte, änderte ich die Versionsnummer von Mungo auf die letzte in meinem _package.json_ und dann lief 'sudo npm update'. –

0

Sie versuchen Versprechen verwenden können.

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

Eine weitere Sache, dont außerhalb der Funktion speichern, da in Asynchron-Code verwendet res.json es ohne warten, läuft für die Funktion speichert ihre Ausführung

+0

Das gibt mir TypeError: Kann Eigenschaft 'dann' von undefined nicht lesen, also untersuche ich jetzt, was in dem Modell, das ich instanziiert habe. Ty für den Tipp über res.json! –

+0

Sichtung enthält das richtige Modell, so habe ich keine Ahnung, warum es den Typ Fehler, den ich oben erwähnt habe, werfen würde. –

+0

versuchen Sie es ohne die Rückkehr vor sighting.save() –