2017-10-16 69 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);