我正在使用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);
});
}
}
非常感谢任何帮助。
答案 0 :(得分:4)
这里有一些问题。
首先,您尝试在return
服务方法中使用userData
来返回数据,但它是一个异步函数,因此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
函数作为局部变量发送到视图中,但实际上并没有调用它来获取数据。由于它是异步函数,因此您无法从视图中调用它。您需要在控制器内调用它并将结果发送到视图:
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
变量将自动提供给您。