2016-01-25 1 views
-2

В моем узле js app я использую функцию в качестве промежуточного программного обеспечения в некоторых маршрутах. Обычно я использовал res.locals как function, чтобы не переопределять объект res.locals. Но теперь я обновил nodejs и выразить последние версии и Яне знаю, почему я получаю следующее сообщение об ошибке:Узел JS - res.locals не является функцией

Unhandled rejection TypeError: res.locals is not a function 
    at /home/jose/workspace/tfg/server.js:116:8 
    at tryCatcher (/home/jose/workspace/tfg/node_modules/bluebird/js/release/util.js:11:23) 
    at Promise._settlePromiseFromHandler (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:491:31) 
    at Promise._settlePromise (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:548:18) 
    at Promise._settlePromise0 (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:593:10) 
    at Promise._settlePromises (/home/jose/workspace/tfg/node_modules/bluebird/js/release/promise.js:672:18) 
    at Async._drainQueue (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:125:16) 
    at Async._drainQueues (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:135:10) 
    at Immediate.Async.drainQueues [as _onImmediate] (/home/jose/workspace/tfg/node_modules/bluebird/js/release/async.js:16:14) 
    at processImmediate [as _immediateCallback] (timers.js:383:17) 

Что это промежуточное программное делает, как показано ниже:

function middle_datos (req, res, next){ 

    var id_usuario = req.user ? req.user._id : 'undefined'; 

    // object to override res.locals 
    var variables_locales = { 
     ip: IP, 
     message: JSON.stringify({ 
      error: req.flash('error'), 
      success: req.flash('success'), 
      info : req.flash('info'), 
     }), 
     title: 'Informa Torrent', 
     subtitle: 'La app con la que podrás contribuir a la mejora de Torrent.', 
     user: req.user, 
     id_usuario: id_usuario 
    }; 

    db.query(queries.obtener_datos_app) // consultamos los datos de la app 
     .then (function(datos_app){ 

      variables_locales.datos_app = datos_app; // obtenemos datos app 

      if (! req.user) throw new Error('no estás loggeado'); // Si no hay usuario conectado --> Continuamos adelante 
               // ya que no consultamos notificaciones ni acciones 

      return db.query(queries.obtener_notificaciones, req.user._id); // consultamos notificaciones 

     }) 
     .then(function(notificaciones){ 
      // obtenemos notificaciones 
      variables_locales.mis_notificaciones = notificaciones; // ls pasamos al objeto res.locals 

      return db.query(queries.obtener_acciones, req.user._id); // consultamos acciones 

     }) 
     .then (function(acciones){ 
      // obtenemos acciones 
      variables_locales.mis_acciones = acciones; 
      res.locals(variables_locales); // Error 
      next(); // siguiente ruta o middleware 
     }) 
     .catch(function (error) { 
      console.log('Error middleware ' + error); // print the error; 
      res.locals(variables_locales); 
      next(); // siguiente ruta o middleware 
     }); 

}; 

Итак, что проблема с res.locals?

Кроме того, если я пытаюсь нажать некоторый ключ-значение res.locals таким образом:

res.locals.someKey = someValue; 

Я не могу получить доступ к этой переменной из моего шаблона нефрита.

Любая помощь была бы оценена!

ответ

1

res.locals не является функцией. Таким образом, вы должны установить переменные, как это:

res.locals = variables_locales; 

И для шаблона JADE, вы, вероятно, придется пройти res.locals переменную в движок рендеринга:

res.render('index', { 
    locals: res.locals 
}); 

А затем получить доступ к переменной в JADE:

p= locals.title 
+0

Спасибо! Я попробовал и отлично работает! Я понимаю, что нет необходимости передавать res.locals в нефрит. –