0

我有一个 ExpressJS 应用程序,其中有api.js管理连接到 Couchbase 的路由,然后发出内部函数couchbaseConnected等待的事件。init()api.js

里面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);
4

2 回答 2

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调用的显式回调。至少将它们作为参数传递给发出的事件。cbgetUserData

此外,您的设置非常规。我不明白为什么getUserData需要异步定义 - 它应该始终可用。如果 coouchbase 连接失败,我不希望该/api/user/data/服务不存在,而是响应一些 500 内部服务器错误消息。

于 2013-08-22T13:33:44.910 回答
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');
});

然后你可以继续做你正在做的事情。它应该工作。

我假设您在启动应用程序时没有明确调用连接或其等效项......所以您收到该错误。

于 2013-08-22T11:43:30.927 回答