Node.js 尝试调用方法时获取“Function:Bound”

Node.js 尝试调用方法时获取“Function:Bound”,node.js,sails.js,Node.js,Sails.js,我正在使用Sails.js MVC,我正在尝试设置一个服务,这样我就可以调用Active Directory服务器并将用户的数据传递回我的控制器 我正在为此使用一些公司内部模块,这些模块连接到我们的服务器,并传回一个用户阵列,其中包含选定用户的所有数据 如果我通过直接在API控制器中创建函数来实现这一点,那么它可以正常工作,但是当通过从单独的文件调用函数而不是返回[function:bound]数组来实现时 控制器LabController.js中的代码: var adGet = require

我正在使用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);
    });
}
}

非常感谢您的帮助。

这里有一些问题

首先,您试图在userData服务方法中使用return返回数据,但它是一个异步函数,因此return语句将数据发送到任何地方。您需要将回调函数作为参数传递给userData,当数据准备就绪时,即当数据库查询返回时,可以调用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函数作为局部变量发送到视图,但实际上并不是调用它来获取数据。因为它是一个异步函数,所以您无法从视图中调用它。您需要从控制器内调用它,并将结果发送到视图:

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方法,使其不接受req和res作为参数,这太过分了。尽可能保存控制器的req和res。最好让userData只期望userId和callback作为参数。另外,除非您已经使用config/globals.js文件关闭了全局服务,否则您不需要在控制器顶部使用服务文件;adGet变量将自动提供给您。

非常感谢您的帮助,特别是您提供的解释。他们真的帮助我理解了为什么它不起作用。