在对象

时间:2018-02-17 16:40:47

标签: javascript node.js mongodb express

我有一个node.js模型,其中有一个名为keys的数组。在这个数组中,我有一堆对象。我需要在视图中将这些对象命名为

以下是模型:

var mongoose = require('mongoose');

var website = require('./website');

var plm = require('passport-local-mongoose');

var accountSchema = new mongoose.Schema({
  isPremium: Boolean,
  accType: String,
  websites: [],
  keys: []
});

accountSchema.plugin(plm);

module.exports = mongoose.model('Account', accountSchema);

以下是观点:

<% include ./../partials/header.ejs %>
  <h1>
    <%= title %>
  </h1>
  <table class="table table-striped table-hover">
    <tr>
      <th>User</th>
      <% if (user) { %>
        <th>Actions</th>
        <% } %>
    </tr>
    <% for(let i=0; i<users.length; i++){ let user = users[i] %>
      <tr>
        <td>
          <%= user.username %>
        </td>
        <td>
          <%= user.keys[i].name %>
        </td>
        <td>
          <a href="/admin/edit/<%= i %>" class="btn btn-info">Edit</a>
          <%#<a href="/admin/delete/i" class="btn btn-danger confirmation">Delete</a>%>
        </td>
      </tr>
      <% } %>
  </table>
  <% include ./../partials/footer.ejs %>

我试图在注册过程中填充密钥,如下所示:

/* POST register */
router.post('/register', function(req, res, next) {
  // use the Account model to create a new user with passport
  Account.register(
    new Account({
      username: req.body.username,
      isPremium: false,
      websites: [
        req.body.websiteOwned,
        req.body.websiteCompet1,
        req.body.websiteCompet2,
      ],
      keys: [
        { name: 'Google', key: '' },
        { name: 'Built With', key: '' },
        { name: 'Check Host', key: '' },
        { name: 'Alexa', key: '' },
        { name: 'Facebook', key: '' },
        { name: 'Instagram', key: '' },
        { name: 'Moz', key: '' },
      ], // accType: 'admin',
    }),
    req.body.password,
    function(err, account) {
      if (err) {
        // failure
        console.log(err);
        res.redirect('error', { title: 'Create Account Error' });
      }
      res.redirect('/login'); // success
    }
  );
});

有几件我不明白的事情。当我这样注册时,在视图中打印的所有内容都是:Object object

当我的模型是这样的时候:

var accountSchema = new mongoose.Schema({
  isPremium: Boolean,
  accType: String,
  websites: [],
  keys: [
    { name: String, key: String },
    { name: String, key: String },
    { name: String, key: String },
    { name: String, key: String },
    { name: String, key: String },
    { name: String, key: String },
    { name: String, key: String },
  ],
});

它打印出{ name: 'Google', key: '' }这是好的,因为我有一个用户而i是0.但是当我编辑我的视图时:

<% for(let i=0; i<users.length; i++){ let user = users[i]; %>
  <tr>
    <td>
      <%= user.username %>
    </td>
    <td>
    <% for(let j=0; j<keys.length; j++) { %>
      <%= user.keys[j] %>
    <% } %>
    </td>
    <td>
      <a href="/admin/edit/<%= i %>" class="btn btn-info">Edit</a>
      <%#<a href="/admin/delete/i" class="btn btn-danger confirmation">Delete</a>%>
    </td>
  </tr>
  <% } %>

所以我在里面加了一个循环,它说keys is not defined。所以我猜我在用范围弄乱了什么?

我的第二个问题是:当我尝试访问keys数组中对象的属性时,如下所示:user.keys[i].name我收到此错误:Cannot read property 'name' of undefined

我做错了什么,我该如何解决?是否可以在实现中使用第一个模型(keys=[])?这将是更具前瞻性的。

1 个答案:

答案 0 :(得分:0)

我不知道为什么,但是当我删除并添加它几次之后,mongoose突然将objectId字段添加到数组中的所有7个对象。它适用于objectId。如果有人理解这里发生的事情,我将不胜感激。