Экспорт функций или переменных в другой модуль в node.js

Я знаю, что есть много вопросов, похожих на мои, но я не смог найти лучшего решения. Я создаю веб-приложение с узлом и rethinkdb. Я хочу организовать различные js-файлы (модули), чтобы у каждого была определенная задача. У меня есть этот файл query.js, чей результат запроса должен быть передан в файл rout.js. Я попытался реализовать это следующим образом.

query.js

//dependencies
var express = require('express');
var path = require('path');
var r = require('rethinkdbdash')({
  port: 28015,
  host: 'localhost',
  db: 'stocks'
});


var len;

//function to get companies list 
exports.clist = function(){
    r.table('company')
.run()
  .then(function(response){
     return response;
  })
 .error(function(err){
    console.log(err);
 })   
}
console.log(exports.clist[0].id)

//function to get number of entries in database
exports.clen = function(){
    r.table('company')
.run()
  .then(function(response){
      len = Object.keys(clist).length;
     return len;
  })
 .error(function(err){
    console.log(err);
 })   
}

routes.js

//dependencies
var express = require('express');
var request = require('request');
var path = require('path');
var r = require('rethinkdbdash')({
  port: 28015,
  host: 'localhost',
  db: 'stocks'
});

//query module
var query = require('./query')


clist = query.clist();
clen = query.clen();


//create router object
var router = express.Router();

//export router
module.exports = router;

//home page
router.get('/', function(req, res) {
    console.log('served homepage');
    res.render('pages/home');
});


//--companies page--//
router.get('/company', function(req,res){  

      console.log('served companies page')
      res.render('pages/company', {
        clist: clist,
        x:clen
      }); 
});

Журнал консоли в query.js показывает, что не может прочитать идентификатор свойства undefined.

Также я хотел бы знать, есть ли способ напрямую передавать переменные вместо использования функций, а затем вызывать их. Я извиняюсь, если решение очевидно.

Подводя итог, я хочу, чтобы результат запроса, который является объектом, был доступен из файла rout.js.

1 ответ

Решение

Примечание: как exports.clist1 это асинхронный метод, вы не можете ожидать, что результат будет напечатан в следующей строке, поэтому прокомментируйте эту строку и следуйте инструкциям ниже

//console.log(exports.clist[0].id)

Вы должны зарегистрировать промежуточное программное обеспечение, чтобы это работало, иначе запрос будет вызываться только во время запуска экспресс-сервера, а не при каждом запросе.

Таким образом, вы можете сделать это,

Надеюсь, у вас было что-то подобное в вашем файле запуска (app.js),

var app = module.exports = express();

routes.js

//query module
var query = require('./query')
var app = require('../app');  // this should resolve to your app.js file said above

//clist = query.clist();
//clen = query.clen();

// middleware to populate clist & clen
app.use(function(req, res, next){
   query.companyList(function(err, data){
      if(!err) {
         req.clist = data.clist;
         req.clen= data.clen;
      }
      next();
   });
});

query.companyList(function(err, data){
      if(err) {
         console.log(err);
      } else {
         console.log(data.clist[0].id);
         console.dir(data.clist);
      }
   });


//create router object
var router = express.Router();

//export router
module.exports = router;

//home page
router.get('/', function(req, res) {
    console.log('served homepage');
    res.render('pages/home');
});


//--companies page--//
router.get('/company', function(req,res){  

      console.log('served companies page')
      res.render('pages/company', {
        clist: req.clist,
        x: req.clen
      }); 
});

Измените свой query.js следующим образом:

//function to get companies list 
exports.companyList = function(next){
    r.table('company')
.run()
  .then(function(response){
     var list = {
       clist: response,
       clen: Object.keys(response).length
     };
     next(null, list);
  })
 .error(function(err){
    console.log(err);
    next(err);
 })   
};
Другие вопросы по тегам