【问题标题】:TypeError: Cannot read property 'id' of undefined - sails and mongodbTypeError:无法读取未定义的属性“id”-sails 和 mongodb
【发布时间】:2014-07-28 19:47:27
【问题描述】:

Sails@beta, mongodb, windows 7 32bit,

我在尝试通过应用程序创建新用户后收到上述错误。当我从 config/policies.js 中删除策略 isPawn 时,一切正常。我不明白这个政策有什么问题。在我看来,我错误地访问了 mongodb id 属性。

isPawn.js https://github.com/mrcn/C_Express/blob/master/api/policies/isPawn.js

module.exports = function(req, res, next) {

  var sessionUserMatchesId = req.session.User.id === req.param('id');
  var isAdmin = req.session.User.admin;

  // The requested id does not match the user's id,
  // and this is not an admin

  if (!(sessionUserMatchesId || isAdmin)) {
    var noRightsError =
    [{
      name: 'noRights',
      message: 'You must be an admin.'
    }];
    req.session.flash = {
      err: noRightsError
    };
    res.redirect('/session/new');
    return;
  }

  next();

};

用户模型——user.js https://github.com/mrcn/C_Express/blob/master/api/models/User.js

module.exports = {

  schema: true,

  attributes: {

    name: {
      type: 'string',
      required: true
    },

    email: {
      type: 'string',
      email: true,
      required: true,
      unique: true
    },

    admin: {
      type: 'boolean',
      defaultsTo: false
    },

    encryptedPassword: {
      type: 'string'
    },

    toJSON: function() {
      var obj = this.toObject();
      delete obj.password;
      delete obj.confirmation;
      delete obj.encryptedPassword;
      delete obj._csrf;
      return obj;
    }
  },

  beforeCreate: function (values, next) {
      //this checks to make sure the passwords match
    if (!values.password || values.password != values.confirmation) {
      return next({err: ["Password\'s don\'t match"]});
    }

    require('bcrypt').hash(values.password, 10, function passwordEncrypt(err, encryptedPassword){
      if (err) return next(err);
      values.encryptedPassword = encryptedPassword;

      console.log();
      console.log(values);
      console.log();

      // values.online=true;
      next();
    });
  }
};

UserController.js:https://github.com/mrcn/C_Express/blob/master/api/controllers/UserController.js

module.exports = {

  // this loads the signup page --> new.ejs
  new : function (req, res) {
    res.locals.flash = _.clone(req.session.flash);
    res.view();
    req.session.flash = {};
  },

  create: function (req, res, next) {

    // Create a user with the params sent from
    // the signup form --> new.ejs
    User.create(req.params.all(), function userCreate (err, user) {

      if (err) {
        console.log(err);
        req.session.flash = {
          err: err
        }

        // if error redirect back to signup page
        return res.redirect('/user/new');
      }

      // after successfully create the user
      // redirect to the show action
      // res.json(user);
      // req.session.flash = {};

      res.redirect('/user/show/'+user.id);
    });
  },

    show: function (req, res, next) {
      User.findOne (req.param('id'), function foundUser (err,user) {
        if (err) return next(err);
        if (!user) return next();
        res.view({
          user: user
        });
      });
    },

    index: function (req, res, next) {
      // EP 13
      // console.log(new Date());
      // console.log(req.session.authenticated);

      //get an array of all users in the User Collection (table)
      User.find(function foundUsers (err, users) {
        if (err) return next(err);
        // pass the array down to the /views/index.ejs page
        // we're rendering our index.ejs passing our users as an object.
        res.view({
          users: users
        });
      });
    },

    edit: function (req, res, next) {
      //Find the user from the id passed in via params
      User.findOne(req.param('id'), function foundUser (err, user){
        if (err) return next(err);
        if (!user) return next('User doesn\nt exist!');

        res.view({
          user: user
        });
      });
    },

    update: function (req, res, next) {
      User.update(req.param('id'), req.params.all(), function userUpdated (err) {
        if (err) {
          return res.redirect('/user/edit/' + req.param('id'));
        }

        res.redirect('/user/show/' + req.param('id'));
        });
    },

    destroy: function (req, res, next) {
      User.findOne(req.param('id'), function foundUser (err, user) {
        if (err) return next(err);
        if (!user) return next('User doesn\nt exist!');

        User.destroy(req.param('id'), function userDestroyed(err) {
          if (err) return next(err);
        });
        res.redirect('/user');
      });
    }
};

【问题讨论】:

  • 你的 UserController.js 文件是什么样的?
  • 将 UserController.js 添加到原始帖子中

标签: node.js sails.js sails-mongo


【解决方案1】:

您似乎正在尝试访问req.session.Userid 属性,但至少在某些情况下req.session.User 不存在。如果它总是应该存在,我会检查负责设置它的代码。否则,请将策略的两行更改为:

var sessionUserMatchesId = (req.session.User && req.session.User.id === req.param('id'));
var isAdmin = req.session.User && req.session.User.admin;

如果 req.session.User 未定义,这将防止它崩溃。

【讨论】:

  • 你测试了吗?在这里,似乎更改暴露了一个新错误----- TypeError: Cannot read property 'admin' of undefined
  • 我没有测试过;我没有你的整个应用程序。我什至没有真正超越第一条线。但是您可以清楚地看到第二行与第一行存在相同的问题;由答案更新以解决该问题。
  • 进行这些更改并创建新用户后,我无法查看自己的个人资料。它会触发 isPawn.js 中的 noRights 错误。所以,我现在明白你在说什么,但似乎问题更深了。
  • 我的 mongodb 用户有两个 ID 属性,id:null 和 _id: ObjectID("53d6b7bbd1729af403b0c75d") 这一直困扰着我。我认为这会导致问题 --- 但我只是用 autoPK 禁用了它: false ,这显然不是问题。错误仍然存​​在。
  • 好的,看来您针对这个特定问题发布的问题已经解决,但请随时发布新问题。
猜你喜欢
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2021-09-06
  • 2018-12-02
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多