【问题标题】:Using exports in nodejs to return a value from function in a function在 nodejs 中使用导出从函数中的函数返回值
【发布时间】:2019-02-14 21:34:26
【问题描述】:

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

// 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



【问题讨论】:

    标签: node.js mongoose nodes


    【解决方案1】:

    你的 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)
    })) 
    

    【讨论】:

    • 回调不是函数... ```服务器在 3000 端口启动 events.js:173 throw er; // 未处理的“错误”事件 ^ TypeError:回调不是函数
    【解决方案2】:

    在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);
    });
    

    【讨论】:

      【解决方案3】:

      这是this problem 的一个特例。同步代码可以转换为异步代码,反之则不行。

      Mongoose 长期以来一直支持 Promise,回调 API 是遗留的。这是他们的一个用例。

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

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

      并且被当作一个承诺来消费。如果需要,应该有承诺链,直到应用程序入口点:

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

      【讨论】:

      • 现在只导出函数....aiases: {}, subpaths: {}, virtuals: { id: VirtualType { path: 'id', getters: [Array], setters: [], options: {} } }, singleNestedPaths: {}, nested: {}, inherits: {}, callQueue: [], _indexes: [], methods: {}, methodOptions: {}, statics: {}, tree: { site_title: { type: [Function: String], required: false }, site_slogan: { type: [Function: String], required: false },
      • 您希望它导出什么?您列出的不是函数,而是 Mongoose 文档。如果您需要它是普通对象,请使用siteConfig.findOne({"company" : company}).lean()
      猜你喜欢
      • 2021-06-01
      • 1970-01-01
      • 2015-04-19
      • 2013-09-27
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多