Mongoose / NodeJS - 检索来自db的字符串,但视为未定义

时间:2016-06-13 04:29:15

标签: html node.js mongodb express mongoose

现在是我的问题:

我查询findOne并填充我的数据库,以便检索要在我的.EJS中使用的字符串数组,但是日志显示该值未定义但是它给出了值名称: “ stringName 未定义”

我一定错过了什么..

这是用户架构:

var UserSchema = new mongoose.Schema({
    username: {  type: String, required: true, index: {  
    unique: true } },
    email: {  type: String, required: true, index: {unique: true } },
    password: {  type: String, required: true },
    tables: [{ type: Schema.Types.ObjectId, ref: 'Table' }],
    resetPasswordToken: String,
    resetPasswordExpires: Date,
    uuid: String,                
});

这是表架构:

var TableSchema = Schema({
    name: { type: String, required: true, index: { unique: true }},
    logos: [{ type: Schema.Types.ObjectId, ref: 'Logo'}],
});

这是我进行查询并将文档发送到.ejs页面的地方:

app.get('/dashboard/:uuid', function(req, res){
    if (req.user && userId != "")
    {
        var query = User.findOne({username:    req.user.username}).populate('tables').select('tables');

        query.exec(function (err, tables){
            if (err) return console.error(err);
            console.log (tables.tables[0].name); // Return the right string name
            res.render('./pages/dashboard.ejs', {username: req.user.username, tables: tables.tables});
        });
    }
    else
        res.redirect('/');
});

这是ejs中的脚本,它应该在我的页面中呈现表名:

 <script>
     $(document).ready(function (){
         <% for(var i = 0; i < tables.length; i++) {%>
         var newTab = "<a href=\"/work\"><div class=\"square\" style=\"display: inline-block\"><span style=\"margin-top: 50%; text-align: center\">" + <%=tables[i].name%> + "</span></div></a>";
         $(newTab).appendTo('.jumbotron');
         <%}%>

    });
</script>

如果你们能够以我的方式启发,那将会非常棒!

1 个答案:

答案 0 :(得分:1)

看看这个实现,这是我如何查询模式,在第一个例子中我们重用req.user(好),第二个我们做2个数据库调用(坏)。在您的示例中,您进行了1次数据库调用,但未填充表模式的Logo字段(错误)。

app.get('/dashboard/:uuid', function(req, res){
    // first example
    // no need to query users, you already have tables field
    if (!req.user) // what is userId, why you check it
        // add `err` checks
        return res.redirect('/');

    TableSchema
        .find({ _id: { $in: req.user.tables } })
        .populate('logos', 'url'); // Logo schema fields
        .exec(function(err, result_tables){
           res.render('./pages/dashboard.ejs', {username: req.user.username, tables: result_tables});
    });

    // or second example
    // if you still for some reason cannot use req.user.tables field
    // but strongly recommend to use first one
    User.findById(req.user._id, 'tables') 
        .exec(function (err, user_tables){
            // add `err` checks
            TableSchema.populate(user_tables, { path: 'logos', model: 'Logo' }, function (err, result_tables){
                // add `err` checks
                res.render('./pages/dashboard.ejs', {username: req.user.username, tables: result_tables});
            });
    });
});

根据你的评论

  Chrome浏览器中的

:“未捕获的ReferenceError:未定义stringName”(stringName =表[0] .name中的内容)

尝试使用forEach运算符

<script>
     $(document).ready(function (){
         <% tables.forEach(function(table){ %>
             var newTab = "<a ommited><%= table.name %></a>"; //notice: no `"`
             $(newTab).appendTo('.jumbotron');
         <% }) %>
    });
</script>