如何从promise获取值并将其存储在Express.js的res.locals中?

时间:2018-01-04 14:19:55

标签: javascript node.js express knex.js bookshelf.js

我想根据用户权限动态构建navbar

因此,当用户登录后,我即可拨打电话' exports.getMenu'执行一个帮助我构建它的查询。

但我无法在函数范围之外获取值(query.rows),然后将其存储在' res.locals'来自Express。

在请求期间获取值并访问它的正确方法是什么?

server.js

var express = require('express');
var menus = require('./config/menu');
require('./config/passport');
var app = express();

app.use(function(req, res, next) 
{
    res.locals.user = req.user ? req.user.toJSON() : null;
    if(typeof res.locals.user !== 'undefined')
    {
        if(res.locals.user != null && res.locals.user.id != null)
        {
            menus.getMenu(req, res, next);                 
        }
    }
    next();
});

menu.js

var bookshelf = require('../config/bookshelf');

exports.getMenu  = function(req, res, next)
{
    var sql = "select * from menus"; // Suppose its the query i'm going to execute

   menus = bookshelf.knex.raw(sql).then(function(query)
   {
        return JSON.stringify(query.rows);
   });
};

我检查了question,但我很难应用解决方案。 例如,描述的解决方案之一:

function delay() {
  // `delay` returns a promise
  return new Promise(function(resolve, reject) {
    // Only `delay` is able to resolve or reject the promise
    setTimeout(function() {
      resolve(42); // After 3 seconds, resolve the promise with value 42
    }, 3000);
  });
}

delay()
  .then(function(v) { // `delay` returns a promise
    console.log(v); // Log the value once it is resolved
  })
  .catch(function(v) {
    // Or do something else if it is rejected 
    // (it would not happen in this example, since `reject` is not called).
  });

在这种情况下,'延迟功能'是由用户创建的。

在我的问题中,我使用了Bookshelf Js的方法。

所以如果我想使用这个解决方案,我必须覆盖Bookshelf / Knex函数吗?

我还怀疑使用'回调'。 如果我使用'回调'我需要改变Bookshelf功能的工作方式吗?

0 个答案:

没有答案