2017-11-08 1 views
0

入力されたデータベースクエリの結果をフロントエンドにアクセスして表示しようとしていますが、入力された変数のプロパティにアクセスしようとすると定義されません。以下は私のmongooseメソッドが参照しているスキーマです。populated()データベースのクエリ結果のプロパティにejsでアクセスするにはどうすればよいですか?

引用スキーマ

const express = require('express') 
const mongoose = require('mongoose') 
const Schema = mongoose.Schema 
const User = require('../models/users') 

let QuoteSchema = new Schema({ 
    author: { 
     type: String, 
     trim: true 
    }, 
    quote: { 
     type: String, 
     unique: [true, "this quote already exists."], 
     trim: true 
    }, 
    submittedBy: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'users' 
     // trim: true, 
     // required: true 
    }] 
}, { 
    timestamps: true 
}) 

const Quote = mongoose.model('quotes', QuoteSchema) 
module.exports = Quote 

ユーザー・スキーマ

const express = require('express') 
const mongoose = require('mongoose') 
const Schema = mongoose.Schema 

let UserSchema = new Schema ({ 
    username: { 
     type: String, 
     unique: [true, "This username is taken."], 
     trim: true, 
    }, 
    email: { 
     type: String, 
     unique: [true, "This email is already being used."], 
     trim: true 
    }, 
    password: { 
     type: String, 
     trim: true 
    }, 
    favorites: [] 
}, { 
    timestamps: true, 
}) 

const User = mongoose.model('users', UserSchema) 
module.exports = User 

はここでマングースクエリです。 populateメソッドはfindメソッドに追加され、sortメソッドはpopulateメソッドに追加されます。結果のタイプはそれがオブジェクトであることを確認しますが、それがej​​sに到達したときにはそのままではないと思います。ルートで

データベースのクエリとポストの要求は、私は、エラーが発生していると思う場所です

router.get('/', (req, res, next) => { 
    console.log("beginning query...") 
    const flashMessages = res.locals.getMessages() 
    if (req.user) { 
     Quote.find({}).populate('submittedBy').sort({ _id: -1 }) 
     .exec((err, results) => { 
      console.log(typeof results) // returns "object" 
      err ? console.log(err) : res.render('index', { quotes: results, user: req.user, csrfToken: req.csrfToken() }); 
     }) 
    } 
}) 


router.post('/quotes', (req, res, next) => { 
    if(req.isAuthenticated()) { 
     let quote = new Quote({ 
      author: req.body.author, 
      quote: req.body.quote, 
      submittedBy: req.body.userId 
     }) 

     quote.save((err, quote) => { 
      if (err) { 
       console.log(err) 
      } else { 
       console.log("Added the quote \"" + quote.quote + "\" by " + quote.author + ".") 
       res.redirect('/') 
      } 
     }) 
     .catch(next) 
    } else { 
     req.flash("restricted", "You must first login before you can add quotes to the community feed.") 
     res.redirect('/') 
    } 
}) 

ファイル。最後のspanタグでは、quotes [i] .submittedByは "submittedBy"変数全体を返します。これは、母集団メソッドが想定していたことを意味します。しかし、そのオブジェクトのプロパティにアクセスしようとすると、undefinedが返されます。 quotes [i] .submittedBy.usernameは未定義を返します。要素を調べると、submittedByは引用で囲まれているので、何らかの理由で文字列であると思います。しかし、JSON.parse()またはJSON.stringify()のいずれかを使用しようとすると、どちらの場合もエラーが発生します。私は何をすべきか分かりません。助けてください!

EJS

<% for(var i = 0; i < quotes.length; i++) {%> 
    <li class="quote"> 
     <i class="fa fa-close fa-quote-close move hidden"></i> 
     <i class="fa fa-heart hidden"></i> 
     <span class="make-bold nhauthorValues" id="<%= quotes[i]._id %>" contenteditable="true"><%= quotes[i].author %></span> once said: "<span class="quoteValues" id="<%= quotes[i]._id %>" contenteditable="true"><%= quotes[i].quote %></span>" 
     <span class="by"><%= quotes[i].submittedBy.username %></span> 
    </li> 
<% } %> 

答えて

0

をレンダリングするには、おそらくあなたが挿入インスタンスされている方法に誤りがある:

let quote = new Quote({ 
    author: req.body.author, 
    quote: req.body.quote, 
    {$push:{submittedBy: req.body.userId}} 
}); 

それが得られない場合はこれがたぶんこれは、 に動作します使用してみてくださいレンダリング前に結果を入力した後に取得しているオブジェクトのスナップショット。

あなたは配列型を与えたスキーマであるため、submittedByの配列を取得してユーザー名に直接アクセスすることはできません。

代わりに、角かっこの代わりに中かっこを使用します。今、あなたはあなたが見積もりを提出するだけのユーザーを持っている場合、その答えに最初の手順を無視し、次のされた同じ手順に従ってください

const express = require('express') 
const mongoose = require('mongoose') 
const Schema = mongoose.Schema 
const User = require('../models/users') 

let QuoteSchema = new Schema({ 
author: { 
    type: String, 
    trim: true 
}, 
quote: { 
    type: String, 
    unique: [true, "this quote already exists."], 
    trim: true 
}, 
submittedBy: { 
    type: Schema.Types.ObjectId, 
    ref: 'users' 
    // trim: true, 
    // required: true 
} //removed square brackets 
}, { 
timestamps: true 
}) 

const Quote = mongoose.model('quotes', QuoteSchema) 
module.exports = Quote 

あなたは次のように行うことができます。複数のユーザーがsubmitByが配列になり、それに応じてアクセスすることができる場合。

関連する問題