从函数导出函数

时间:2013-08-22 10:02:01

标签: node.js events express couchbase

我有一个ExpressJS应用程序,我在管理连接到Couchbase的路由中有api.js,然后发出couchbaseConnectedinit()函数等待的事件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);

2 个答案:

答案 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或它的等价物.....所以你得到了这个错误。