2017-10-16 5 views
0

Je construis une petite API REST sur NodeJS avec Express et Mongoose et je cours dans une erreur TypeError que je n'arrive pas à résoudre.NodeJS Mongoose record.save TypeError

Router Express et Mongoose sont les suivantes:

const Router = require('express').Router; 
const router = new Router(); 
const querystring = require('querystring') 
const mongoose = require('mongoose') 
const Schema = mongoose.Schema; 

const iptvSchema = new Schema({ 
    appName: { type: String, required: true }, 
    userId: { type: String, required: true }, 
    level: { type: String, required: true }, 
    title: { type: String, required: true }, 
    message: {type: String}, 
    meta: { 
    ip: {type: String}, 
    mac: {type: String}, 
    campus: {type: String}, 
    venue: {type: String}, 
    room: {type: String}, 
    serial: {type: String} 
    }, 
    tags: {type: Array} 
}); 

const Iptv = mongoose.model('Iptv', iptvSchema) 

router.route('/add/') 
    .all(function(req, res, next) { 
    console.log("/add/ route") 
    var query = Object.keys(querystring.parse(req.originalUrl))[1] 
    console.log(query) 
    var record = new Iptv(query); 
    record.save(function(err) { 
     console.log("save") 
     if (err) { 
     console.log("error") 
     console.log(err) 
     } else { 
     console.log("record created") 
     } 
    }) 
    }) 


module.exports = router; 

La requête entrante est une requête GET AJAX de JQuery sur le client. La variable query est vérifiée en tant que chaîne JSON correcte extraite de la requête GET:

{"appName":"iptv","userId":"0002026941e2","level":"info","title":"Amino Connected"} 

Les demandes erreurs comme suit:

TypeError: Cannot use 'in' operator to search for '_id' in {"appName":"iptv","userId":"0002026941e2","level":"info","title":"Amino Connected"} 
at model.Document.$__buildDoc (/Users/jeremylo/Documents/dev/log/node_modules/mongoose/lib/document.js:222:24) 
at model.Document (/Users/jeremylo/Documents/dev/log/node_modules/mongoose/lib/document.js:67:20) 
at model.Model (/Users/jeremylo/Documents/dev/log/node_modules/mongoose/lib/model.js:48:12) 
at new model (/Users/jeremylo/Documents/dev/log/node_modules/mongoose/lib/model.js:3785:13) 
at /Users/jeremylo/Documents/dev/log/model/iptv/router.js:31:18 
at Layer.handle [as handle_request] (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/layer.js:95:5) 
at next (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/route.js:137:13) 
at Route.dispatch (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/route.js:112:3) 
at Layer.handle [as handle_request] (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/layer.js:95:5) 
at /Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/index.js:281:22 
at Function.process_params (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/index.js:335:12) 
at next (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/index.js:275:10) 
at Function.handle (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/index.js:174:3) 
at router (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/index.js:47:12) 
at Layer.handle [as handle_request] (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/layer.js:95:5) 
at trim_prefix (/Users/jeremylo/Documents/dev/log/node_modules/express/lib/router/index.js:317:13) 

Toutes les pensées sont grandement appréciés.

+0

Quelle est la valeur de 'req.originalUrl'? Il semble contenir des valeurs incorrectes pour votre requête. – doublesharp

Répondre

1

vous êtes probablement passer un string JSON pas un objet JSON, vous devez analyser à l'objet JSON avant de créer votre dossier

remplacer

var record = new Iptv(query);

avec

var record = new Iptv(JSON.parse(query));

+0

Merci! C'est toujours les choses simples qui sont négligées ... – jlommori

+0

vous êtes les bienvenus ... content que ça a aidé :) –

0

La plupart des navigateurs prennent en charge JSON.parse(), qui est défini dans ECMA-262 5th Edition (le spécification que JavaScript est basé sur). Son utilisation est simple:

var json = '{"appName":"iptv","userId":"0002026941e2","level":"info","title":"Amino Connected"}', 
    obj = JSON.parse(json); 

console.log(obj.appName);