【问题标题】:Getting "Function: Bound" when trying to call a method尝试调用方法时获取“功能:绑定”
【发布时间】:2015-08-31 20:22:14
【问题描述】:

我正在使用 Sails.js MVC,我正在尝试设置一个服务,以便我可以调用 Active Directory 服务器并将用户的数据传回我的控制器。

我为此使用了一些公司内部模块,这些模块连接到我们的服务器并传回一个包含选定用户所有数据的用户数组。

如果我通过直接在 API 控制器中创建函数来执行此操作,它可以正常工作,但是通过从单独文件中调用函数而不是返回 [Function: bound] 数组来执行此操作时。

来自控制器的代码 (LabController.js):

var adGet = require('../services/adGet');
module.exports = {

test: function (req, res) {
    console.log(adGet.userData);
    res.view({
        user: adGet.userData
    });
}
}

来自服务的代码 (adGet.js):

module.exports = {
userData: function (req, res) {
    var ad = require('active-directory');
    ad.setCredentials({
        user: 'username_removed',
        password: 'password_removed'
    });
    ad.getUser(req.session.sisso.idsid).then(function (user) {
        return (user);
    });
}
}

非常感谢任何帮助。

【问题讨论】:

    标签: node.js sails.js


    【解决方案1】:

    这里有一些问题。

    首先,您尝试在userData 服务方法中使用return 来返回数据,但它是一个异步函数,因此return 语句将数据发送到任何地方。您需要将回调函数作为参数传递给userData,当数据准备好时(即数据库查询返回时)可以调用该函数:

    module.exports = {
      // note the new `cb` argument
      userData: function (req, res, cb) {
        var ad = require('active-directory');
        ad.setCredentials({
            user: 'username_removed',
            password: 'password_removed'
        });
        ad.getUser(req.session.sisso.idsid)
          .then(function (user) {
            // Still nice to use `return` to make sure nothing
            // gets executed after this statement, but it's the
            // callback function that actually gets the data.          
            // Note the `null` first argument, indicating no errors.
            return cb(null,user);
          })
          .catch(err) {
            return cb(err);
          });
      }
    }
    

    其次,您将adGet.userData 函数作为局部变量发送到您的视图,但实际上并没有调用它来获取数据。而且由于它是一个异步函数,因此您将无法从您的视图中调用它。您需要从控制器中调用它并将 result 发送到视图:

    var adGet = require('../services/adGet');
    module.exports = {
    
      test: function (req, res) {
        // Call service function, passing callback function in as argument
        adGet.userData(req, res, function(err, user) {
          // Handle errors
          if (err) {return res.serverError(err);}
          // If all goes well, send user data to view
          return res.view({
            user: user
          });
        });
      }
    }
    

    不太重要的是,您可以重构 userData 方法,使其不接受 reqres 作为参数——这太过分了。尽可能为您的控制器保存reqres。最好有 userData 只期望 userIdcallback 作为参数。此外,除非您使用config/globals.js 文件关闭了全局服务,否则您不需要在控制器顶部使用服务文件; adGet 变量将自动提供给您。

    【讨论】:

    • 非常感谢您的帮助,尤其是您提供的解释。他们真的帮助我理解了为什么它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    相关资源
    最近更新 更多