在Node.js中使用Exports从函数中的函数返回值

时间:2019-02-14 12:17:49

标签: node.js mongoose nodes

我一直在阅读有关模块化代码的内容,并决定将一些函数导出到单独的文件中,并在调用后将其包含在我的主函数中。如果我调用它,只有我的网站配置不会返回:

// Export from my controller
// File: Controller.js
exports.site_config = function(company, data) {

   siteConfig.find({"company" : company}, function data (err, siteConfig, data) {
    // Console.log(siteConfig[0]) // Works
    return siteConfig[0] // This return is not working
    })
  // Only here returns works....
}

// File: Index.js
const siteController = require('../controllers/site');
console.log(siteController.site_config('company2')) // nothing return



3 个答案:

答案 0 :(得分:0)

您的find函数返回一个回调,您可以执行以下操作:

// Export from my controller
// File: Controller.js
exports.site_config = function(company, data, callback) {

   siteConfig.find({"company" : company}, function (err, siteConfig, data) {
    callback(siteConfig[0]);
    })
}

// File: Index.js
const siteController = require('../controllers/site');
console.log(siteController.site_config('company2', null,function (result) {
  console.log(result)
})) 

答案 1 :(得分:0)

在nodejs- express js中,您需要将函数作为回调传递。

当结果可用或代码中发生错误时,将它们返回给回调;

//文件:Controller.js

在module.exports中编写函数:

module.exports = {
   var site_config = function(company,callback) {
      siteConfig.find({"company" : company}, function(err, data) 
      {
         if(!err && data){
          // no error and data is available , so pass err as null and data as data[0] to callback
         return callback(null,data[0]);
         }else{
          // error occured , pass err as err and data = null to callback
          return callback(err,null);
         }
      });
   }
}

在您的文件中:Index.js,需要文件Controller.js

const siteController = require('../controllers/Controller');
siteController.site_config('company2',function(err,data){
    console.log(data);
});

答案 2 :(得分:0)

这是this problem的特例。可以将同步代码转换为异步代码,反之亦然。

Mongoose长期以来一直支持promises,回调API是旧的。这是他们的用例。

模块应导出配置对象的Promise。检索单个文档的更简洁方法是findOne

exports.site_config = function(company, data) {
   return siteConfig.findOne({"company" : company});
};

并作为承诺而消耗。应该有一个promise链,如果需要,可以到应用程序入口点:

// inside `async` function:
const siteController = require('../controllers/site');
const config = await siteController.site_config('company2');