Node.js 尝试调用方法时获取“Function:Bound”
我正在使用Sails.js MVC,我正在尝试设置一个服务,这样我就可以调用Active Directory服务器并将用户的数据传递回我的控制器 我正在为此使用一些公司内部模块,这些模块连接到我们的服务器,并传回一个用户阵列,其中包含选定用户的所有数据 如果我通过直接在API控制器中创建函数来实现这一点,那么它可以正常工作,但是当通过从单独的文件调用函数而不是返回[function:bound]数组来实现时 控制器LabController.js中的代码: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
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变量将自动提供给您。非常感谢您的帮助,特别是您提供的解释。他们真的帮助我理解了为什么它不起作用。