入力されたデータベースクエリの結果をフロントエンドにアクセスして表示しようとしていますが、入力された変数のプロパティにアクセスしようとすると定義されません。以下は私の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メソッドに追加されます。結果のタイプはそれがオブジェクトであることを確認しますが、それがejsに到達したときにはそのままではないと思います。ルートで
データベースのクエリとポストの要求は、私は、エラーが発生していると思う場所です
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>
<% } %>