【问题标题】:Mongoose TypeError: Cannot read property 'googleID' of undefinedMongoose TypeError:无法读取未定义的属性“googleID”
【发布时间】:2019-03-23 17:17:56
【问题描述】:

我正在制作一个适用于个人用户的待办事项应用程序。我可以在没有用户 ID 的情况下将数据粘贴到数据库中,但是当我尝试将 google id 添加到架构和数据库时,会引发类型错误。我的猫鼬模式似乎坏了

TodoController.js

var bodyParser = require("body-parser");
var mongoose = require("mongoose");
const keys = require("../configs/keys");
const Todo = require("../models/todo-model")
//Connect to the database
mongoose.connect(keys.mongodb.tododbURL,() => {
    console.log("connected to mongodb server");
});

   

//var data = [{item:"get milk"}, {item:"walk nan"}, {item:"code for a bit"}];
var urlencodedParser = bodyParser.urlencoded({ extended: true });

const authCheck = (req, res, next) =>{
    if(!req.user){
        //executed if user isn't logged in
        res.redirect("/");
    } else {
        //if logged in
        next(); // fires to the next functionS
    }
};


module.exports = function(app){
    
    app.get("/todo", authCheck, function(req, res){
        //Get data from mongoDB andd pass through view
        Todo.find({}, function(err, data){
            if (err) throw err;
            res.render("todo", {todos:data});
        });
        console.log(req.user.googleID)
    });
    

    app.post("/todo", urlencodedParser,function(req, res){
        //get data from view and put it in the database
        var newTodo = Todo({item: req.body, googleID: req.user.googleID}).save(function(err, data){
            if (err) throw err;
            res.json(data);
        })
    });

    app.delete("/todo/:item", function(req, res){
        // delete requested item from the database
        Todo.find({item: req.params.item.replace(/\-/g, " ")}).remove(function(err, data){
            if(err) throw err;
            res.json(data);
        });
        
    });
};
req.user.googleID 将返回诸如 1374979743 之类的内容

待办事项模型.js

const mongoose = require("mongoose");


const todoSchema = new mongoose.Schema({
    todo: String,
    googleID: String 
});

const Todo = mongoose.model("Todo", todoSchema);
module.exports = Todo;
istening on port 3000
(node:2656) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
connected to mongodb server
connected to mongodb server
TypeError: Cannot read property 'googleID' of undefined

【问题讨论】:

  • 您能否说明确切的错误是什么以及在哪里遇到它?
  • 对不起,不够具体,我试图发送到数据库的数据不起作用。当我尝试将数据从网站发送到数据库时触发此错误抛出看起来像这样@ 987654324@最后一部分特别是哪里错了
  • 应该是 req.body.googleId 还是 req.body.user.googleId ??
  • @xan_z re.user.googleID 来自护照会话
  • console.log 您的 req.body 并查看您的帖子请求中是否确实有此内容。

标签: javascript node.js mongoose schema


【解决方案1】:

如果 user 是您在请求正文中发送到 API 的内容(我做出此结论是因为我在您的代码 sn-p 中看不到 passportjs 的用法),那么您会收到此错误,因为您使用了 @ 987654323@ 而不是 req.body.user.googleIDbodyParser 从 HTTP 请求的正文中解析 JSON 并将其放在 req.body 下。

【讨论】:

  • 嗨,我已经尝试添加 req.body.user.googleID 但是它似乎抛出了同样的错误
  • 我也只会从客户端的文本框中发布,因此只会发送项目数据,可能是正文解析器自身的问题
【解决方案2】:

找到了问题,我调用的是 req.body 而不是 req.body.item。我不得不调用 item 因为我现在将两个项目推送到数据库它现在可以工作了,我意识到在我的 CS 课程中途使用一个数据库

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2020-12-24
    相关资源
    最近更新 更多