javascript – underscore.js .keys和.omit无法按预期工作

我正在运行MongoDB,通过Mongoose访问来存储用户记录.我也在服务器上有下划线.我有一个RESTful API,其路由从数据库返回一个集合(对象数组).我想将完整集合返回给客户端,但是从每个对象中删除密码元素,以便不会将其发送到客户端.在任何人说什么之前,我会使用bcrypt在最终版本中加盐和哈希密码:)

今天我在数据库中只有一个条目,用户’管理员’.这是我路线中的代码:

app.get('/users', function(req, res) {
  User.find().sort({'userName': 'ascending'}).exec(function(err, data) {
    _.each(data, function (element, index, list) {
      console.log('userName=' + element.userName);
      console.log('password=' + element.password);
      delete element.password;
      console.log('keys: ' + _.keys(element));
      console.log('password=' + element.password);
      console.log(_.omit(element, 'password'));
    });
    res.json(data);
  });
});

我收到的回复信息是:

[{"_id":"54058e6eb53dd60730295f59","modifiedOn":"2014-09-01T15:19:10.012Z",
"userName":"administrator","password":"*","role":"administrator",
"__v":0,"createdBy":"54058e6eb53dd60730295f59","createdOn":"2014-09-01T15:19:10.004Z",
"previousLogins":[],"accountIsLocked":false,"loginAttempts":0}]

我们没问题,因为res.json(data)语句只是将原始数据发送回浏览器 – 这不是问题.问题是删除(以及我使用.omit)似乎不适用于我的收藏!正如您所看到的,有很多用于调试的console.log,这是输出的内容:

userName=administrator
password=*
keys: $__,isNew,errors,_maxListeners,_doc,_pres,_posts,save,_events
password=*
{ _id: 54058e6eb53dd60730295f59,
  modifiedOn: Mon Sep 01 2014 19:19:10 GMT+0400 (GST),
  userName: 'administrator',
  password: '*',
  role: 'administrator',
  __v: 0,
  createdBy: 54058e6eb53dd60730295f59,
  createdOn: Mon Sep 01 2014 19:19:10 GMT+0400 (GST),
  previousLogins: [],
  accountIsLocked: false,
  loginAttempts: 0 }

_.keys的输出显示了键(我假设来自一个对象原型?),我没有看到我在console.log(元素)时,但没有可以通过element.key访问的键.

知道为什么我看到这种行为吗?

解决方法:

问题是传递给exec回调函数的数据实际上是一个Document对象 – 可以被认为是Mongoose创建的模型集合.这些对象有很多有用的方法,它们记得与db等的连接 – 但是你将无法将它们作为普通对象处理.

解决方案是通过lean()指示Mongoose你真的想要普通的JS对象作为查询的结果:

User.find().sort({'userName': 'ascending'}).lean().exec(function(err, data) {
  // process the data
});

或者,您应该能够使用.toObject()方法将每个模型转换为普通对象,然后对其进行过滤:

var filtered = _.map(data, function(model) {
  return _.omit(model.toObject(), 'password');
});
res.json(filtered);

……但我宁愿使用第一种方法. )

上一篇:javascript – Express / Mongoose应用程序的结构


下一篇:javascript – 延迟加载/更多数据滚动Mongoose / Nodejs