我有一个ExpressJS应用程序,我在管理连接到Couchbase的路由中有api.js
,然后发出couchbaseConnected
内init()
函数等待的事件api.js
。 / p>
在init()
内,我想推送exports.someFunction(req, res){return something;}
。但是,当我将这些导出放在init()
函数中时,我收到错误.get() requires callback functions but got a [object Undefined]
,所以看起来我做错了。
问题是我如何从NodeJS中的另一个函数导出函数?
以下是代码:
//connecting to couchbase and emitting event on connection
couchbase.connect(dbConfiguration, function (err, bucket) {
if (err) {
console.log(err);
}
cb = bucket;
eventEmitter.emit('couchbaseConnected');
});
//listening for the event and fire init() when it's there
eventEmitter.on('couchbaseConnected', function (e) {
console.log('Connected to Couchbase.'.green);
init();
});
function init() {
exports.getUserData = function (req, res) {
if (req.user != undefined && req.user.meta != undefined) {
res.json(200, {result: 'ok'})
}
else {
res.json(401, {error: 'Unauthorized request.'})
}
};
}
这是ExpressJS .get(),位于app.js
:
app.get('/api/user/data/:type', api.getUserData);
答案 0 :(得分:1)
这是位于app.js中的ExpressJS .get():
app.get('/api/user/data/:type', api.getUserData);
错误消息.get() requires callback functions but got a [object Undefined]
非常清楚会发生什么:您需要API模块,它开始连接到数据库,您通过将不存在的属性传递给.get
来定义您的快速应用程序 - 由于尚未调用init
且尚未分配getUserData
,因此失败。你需要做的是
var api = require('api');
eventEmitter.on('couchbaseConnected', function () {
app.get('/api/user/data/:type', api.getUserData); // now it is available
});
然而,这看起来不像是好的代码。而不是通过couchbaseConnected
事件松散地耦合它们,您最好使用使用请求值(即cb
存储桶或getUserData
方法)调用的显式回调。至少将它们作为参数传递给发出的事件。
此外,您的设置是非常规的。我不明白为什么getUserData
需要异步定义 - 它应该始终可用。如果沙发基地连接失败,我不希望{em>不存在的<{1}}服务,而是以<500>内部服务器错误消息回复。
答案 1 :(得分:0)
这是我做出一些假设的答案,因为您提供的数据不足以在您启动应用时知道自己在做什么。
我建议对代码进行一些更改:
module.exports.connect = function(callback){
couchbase.connect(dbConfiguration, function (err, bucket) {
if (err) {
console.log(err);
callback(err);
}
cb = bucket;
module.exports.getUserData = getUserData();
callback(err); //just callback with no error as you don't require to send the database
});
}
function getUserData(req, res){
if (req.user != undefined && req.user.meta != undefined) {
res.json(200, {result: 'ok'})
}
else {
res.json(401, {error: 'Unauthorized request.'})
}
};
并在你正在启动应用程序的app.js文件中执行此操作
var api = require('./api');
api.connect(function(error){
if (error) throw error;
app.listen(3000);
console.log('Express started on port 3000');
});
然后你可以继续完成你正在做的事情。它应该工作。
我假设你在启动应用程序时没有明确地调用connect或它的等价物.....所以你得到了这个错误。