2017-02-21 2 views
1

Ich hatte einen einfachen Express NodeJS Server eingestellt.Wie übergeben Sie Mongoose Rückgabevariable in NodeJS Express Router Res.Render?

Ich möchte den Wert der Einstellung, die von mongoose.find() an res.render zurückgegeben wird als eine Variable speichern, aber jedes Mal wirft es mich einen Fehler, der Cannot read property of undefined.

Hier ist meine routes.js Datei.

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 
     }); 
    }); 

}); 

Das ist meine Einstellung Modell:

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); 

Hier ist der Fehler im Browser, ich bin mit Mops Ansicht.

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

Hier ist mein das Protokoll in meinem Terminal, feststellen, dass console.log(setting) die richtigen Einstellungen zu ausgeführt wird, da ich nur ein Dokument für Logo.

[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 - - 

Hier ist ein Überblick: Snapshot of the error

UPDATE

Hier ist der Ausschnitt aus meiner .pug Datei ist, ich bin Rendering, sind alle Vertiefungen rechts.

  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. 

Antwort

1

Sie einen Tippfehler in Ihrem Code haben, die Zuordnung setting: res.setting ist derjenige, der das Problem verursacht. Außerdem gibt find() ein Array von Dokumenten zurück, kein einziges Dokument.

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      
      }); 
     }); 
    }); 
} 
+1

Dank @chridam Sie meinen Tag gerettet: Sie können findOne() dafür verwendet werden soll. Ich habe es mehrmals mit 'setting: setting' versucht, aber nicht bemerkt und wusste, dass' Setting.find() 'stattdessen einen Fehler zurückgeben würde. 'Setting.findOne()' funktioniert gut. :) –