【问题标题】:How to pass Mongoose return variable in NodeJS Express router res.render?如何在 NodeJS Express 路由器 res.render 中传递 Mongoose 返回变量?
【发布时间】:2017-02-21 23:52:33
【问题描述】:

我已经设置了一个基本的 Express NodeJS 服务器。

我想将 mongoose.find() 返回的设置值作为变量保存到 res.render 中,但每次它都会向我抛出 Cannot read property of undefined 的错误。

这是我的 routes.js 文件。

var Setting = require('../../models/setting');

module.exports = function(app, passport) {
 app.get('/admin', function(req, res) {
    Setting.find(function(err, setting) {
        if (err) {
            return res.send(500, err);
        }
        console.log(setting);
        res.render('admin/customize/settings', {
            title: 'Change Setting | eduBird',
            user: req.user,
            setting: res.setting
                // setting: res.settings
        });
    });

});

这是我的设置模型:

var mongoose = require('mongoose');

var settingSchemma = mongoose.Schema({
 logo: {
    logo16: String,
    logo32: String,
    logo96: String,
    logo128: String,
    logo128white: String
 }
});

module.exports = mongoose.model('Setting', settingSchemma);

这是浏览器中的错误,我使用的是 pug 视图。

name='logo32' value=setting.logo.logo32) Cannot read property 'logo' of undefined

这是我在终端中的日志,请注意 console.log(setting) 正在正确执行设置,因为我只有一个徽标文档。

[nodemon] starting `node ./bin/www server`
  Server running on port3000
  [ { _id: 58ac45xxxx3xxxxf3,
   __v: 0,
  logo:
 { logo128white: 'https://res.cloudinary.com/xxxxx/image/uplo
   ad/xxxxx/128x128-white_aqya8e.png',
   logo128: 'https://res.cloudinary.com/xxxxx/image/upload/v1
   xxxxxxx/128x128_jn9dzz.png',
   logo96: '',
   logo32: 'https://res.cloudinary.com/xxxx/image/upload/v14
    xxxxx/32x32_wtk3gk.png',
   logo16: 'https://res.cloudinary.com/pinterested222/image/upload/v14
     xxxx/16x16_o4gzhd.png' } } ]
  GET /stylesheets/style.css 304 6.947 ms - -

这是快照Snapshot of the error

更新

这是我的 .pug 文件的 sn-p,我正在渲染,所有缩进都是正确的。

           form.logoForm.z-depth-3.col.s12(method='post' action='/settings/logo')
                .row
                    .col.s12.m8.offset-m2
                        h4.center Change Logo Settings
                        p.center Add URL for valid Logos.
                        .divider
                    .input-field.col.s12
                        input.validate#logo16(placeholder="URL for 16x16 .png log" name='logo16' value=setting.logo.logo16)
                        label.active(for='logo16') 16x16 Logo
                    .input-field.col.s12
                        input.validate#logo32(placeholder="URL for 32x32 .png log" name='logo32' value=setting.logo.logo32)
                        label.active(for='logo32') 32x32 Logo
                    .input-field.col.s12
                        input.validate#logo128(placeholder="URL for 128x128 .png log" name='logo128' value=setting.logo.logo128)
                        label.active(for='logo128') 128x128 Logo
                    .input-field.col.s12
                        input.validate#logo128white(placeholder="URL for 128x128 white .png log" name='logo128white' value=setting.logo.logo128)
                        label.active(for='logo128white') 128x128 Logo White(for dark bg)
                .row
                    .col.s12.m4.offset-m4.l4.offset-l4
                        button.center.logoSubmit.btn.btn-large.indigo.darken-4.white-text.waves-effect.waves-light.disabled Save #[i.fa.fa-chevron-circle-right.right]
                        button.center.btn.btn-large.indigo.darken-4.white-text.waves-effect.waves-light Save #[i.fa.fa-chevron-circle-right.right]
                    .col.s12.m6.offset-m3
                        p.center(style='margin-top: .3em; padding: .2em') *You can only save the settings if any of the form fields are different/updated.

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    您的代码中有错字,分配 setting: res.setting 是导致问题的原因。此外,find() 返回一个文档数组,而不是单个文档。为此,您可能需要使用 findOne()

    var Setting = require('../../models/setting');
    
    module.exports = function(app, passport) {
        app.get('/admin', function(req, res) {
            Setting.findOne({}).exec(function(err, setting) {
                if (err) {
                    return res.send(500, err);
                }
                console.log(setting);
                res.render('admin/customize/settings', {
                    title: 'Change Setting | eduBird',
                    user: req.user,
                    setting: setting                    
                });
            });
        });
    }
    

    【讨论】:

    • 感谢@chridam,你拯救了我的一天。我尝试使用setting:setting 几次,但没有注意到并且知道Setting.find() 会返回错误。 Setting.findOne() 效果很好。 :)
    猜你喜欢
    • 2016-04-09
    • 2020-09-16
    • 2013-05-13
    • 2016-10-06
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多