0

I've been doing some reading on modularizing my code and decided to export some functions to a separate file and include them in my main function once it's called. Only my config of my website is not returning if I'm calling it:

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



jo_va
  • 13,504
  • 3
  • 23
  • 47

3 Answers3

0

your find function return a callback you can do something like this:

// 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)
})) 
Shay Moshe
  • 482
  • 4
  • 16
  • Callback is not an function... ```Server started on port 3000 events.js:173 throw er; // Unhandled 'error' event ^ TypeError: callback is not a function –  Feb 15 '19 at 03:41
0

In nodejs- express js , you need to pass function as callback .

when result is available or some error occurred in code return them in callback;

// File: Controller.js

write your function inside 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);
         }
      });
   }
}

in you File: Index.js , require file Controller.js

const siteController = require('../controllers/Controller');
siteController.site_config('company2',function(err,data){
    console.log(data);
});
Saurabh Mistry
  • 12,833
  • 5
  • 50
  • 71
0

This is a special case of this problem. Synchronous code can be transformed to asynchronous but not vice versa.

Mongoose has been supporting promises for a long time, callback API is legacy. This is a use case for them.

A module should export a promise of configuration object. A more concise way to retrieve a single document is findOne:

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

And is consumed as a promise. There should be promise chain, up to to application entry point if needed:

// inside `async` function:
const siteController = require('../controllers/site');
const config = await siteController.site_config('company2');
Estus Flask
  • 206,104
  • 70
  • 425
  • 565
  • It exports only the function now.... `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 },` –  Feb 15 '19 at 03:42
  • What do you expect it to export? What you listed is not a function, it's Mongoose document. In case you need it to be plain object, use `siteConfig.findOne({"company" : company}).lean()` – Estus Flask Feb 15 '19 at 10:06