2017-10-16 72 views
0

我正在用Express和Mongoose在NodeJS上構建一個小的REST API,並且正在運行到我無法解決的TypeError。是NodeJS Mongoose record.save TypeError

快速路由器和貓鼬如下:

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; 

傳入的請求是從一個JQuery的GET AJAX請求的客戶端。如下

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

的請求錯誤出:所述query變量被驗證爲從GET請求中提取正確的JSON字符串

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) 

任何想法是不勝感激。

+0

'req.originalUrl'的值是什麼?它似乎包含您的查詢不正確的值。 – doublesharp

回答

1

也許你正在傳遞一個JSON字符串不是一個JSON對象,你需要將它解析爲JSON對象創建一個記錄之前

更換

var record = new Iptv(query);

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

+0

謝謝!它總是被忽視的簡單的東西... – jlommori

+0

歡迎您...高興它幫助:) –

0

大多數瀏覽器都支持JSON.parse(),它在ECMA-262第5版中定義JavaScript基於的規範)。它的用法很簡單:

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

console.log(obj.appName);