【问题标题】:How to get the current User inside a 'before save' operation hook?如何在“保存前”操作挂钩中获取当前用户?
【发布时间】:2017-02-26 17:49:01
【问题描述】:

loopback.getCurrentContext() 对我来说是空的。为什么?我需要从上下文中获取当前用户。操作钩子的 ctx 不是同一个上下文,据我所知不包含我需要的内容。

Customer.observe('before save', function checkPermission(ctx, next) {

  //do I have a loopback context that works?
  var context = loopback.getCurrentContext();
  console.log("context is: " + context);//null!
});

谢谢

【问题讨论】:

    标签: node.js loopbackjs strongloop


    【解决方案1】:

    这不是 PostgreSQL 特有的,但它是一个错误。 https://github.com/strongloop/loopback/issues/878#issuecomment-128417677

    【讨论】:

      【解决方案2】:

      我知道这个问题很老,但这可能会对某些人有所帮助

      根据环回文档 https://loopback.io/doc/en/lb3/Using-current-context.html

      在 LoopBack 2.x 中,出于兼容性原因,默认情况下禁用此功能。要启用,请添加

      首先您需要将此添加到您的客户模型中

      "injectOptionsFromRemoteContext": true
      

      然后:

      Customer.observe('before save', function checkPermission(ctx, next) {
        //ctx.options returns tokenid, userid & ttl
        console.log(ctx.options);
        return next();
      });
      

      【讨论】:

        【解决方案3】:

        我认为您应该 add a pre-processing middleware 使用当前用户填充上下文。

        /server/server.js

        app.use(loopback.context());
        app.use(loopback.token());
        
        app.use(function setCurrentUser(req, res, next) {
            if (!req.accessToken) {
                return next();
            }
            app.models.Customer.findById(req.accessToken.userId, function(err, user) {
                if (err) {
                  return next(err);
                }
                if (!user) {
                  return next(new Error('No user with this access token was found.'));
                }
        
                var loopbackContext = loopback.getCurrentContext();
                if (loopbackContext) {
                      loopbackContext.set('currentUser', user);
                }
                next();
             });
        });
        

        /common/models/customer.js

        var loopback = require('loopback');
        module.exports = function(Customer) {
            Customer.observe('before save', function checkPermission(ctx, next) {
        
                var context = loopback.getCurrentContext();
                var currentUser = context && context.get('currentUser');
                console.log(currentUser);
        
                next();
            });
        };
        

        【讨论】:

        • 谢谢,我尝试在 server.js 中添加该代码,但没有任何更改。仍然是空上下文。太奇怪了。这与使用 Postgres 有关吗?有一个关于 MongoDB 和 MySQL 存在空上下文错误的讨论列表。
        • 我将从头开始尝试一个完整的准系统项目,看看我是否仍然得到一个空上下文。如果是这样,我将其称为错误并转移到其他东西以供生产使用。
        • 更新,我有一个准系统项目,并且“保存前”中的 loopback.getCurrentContext() 确实为空。不知道这只是我还是一个错误。我正在使用 Postgres 连接器。
        • 是的,我尝试了这段代码,但我仍然得到一个空上下文。我的 enableHTTPContext 设置为 True 并且我查看了文档中的所有教程。别担心,伙计们。明年我会再试一次。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 2011-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多