首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将函数或变量导出到node.js中的另一个模块

将函数或变量导出到node.js中的另一个模块
EN

Stack Overflow用户
提问于 2016-10-16 10:17:16
回答 1查看 2.9K关注 0票数 0

我知道有许多类似我的问题,但我找不到最好的解决办法。我正在创建一个带有节点和rethinkdb的web应用程序。我想组织不同的js文件(模块),使每个都有特定的任务。我有这个query.js文件,它的查询结果必须传递给routes.js文件。我试着用以下方式来实现这一点。

query.js

代码语言:javascript
复制
//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

代码语言:javascript
复制
//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中的控制台日志显示无法读取未定义的属性id。

另外,我想知道是否有一种方法可以直接传递变量,而不是使用函数然后调用它。如果解决方案很明显,我很抱歉。

总之,我希望查询结果可以从routes.js文件中访问。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-16 10:28:19

注意:由于exports.clist1是一个异步方法,所以不能期望在下一行中打印结果,因此请注释这一行并按照如下所示

代码语言:javascript
复制
//console.log(exports.clist[0].id)

您必须注册一个中间件才能使其工作,否则,查询只会在快速服务器启动时调用,而不是在每次请求时调用。

所以你可以这样做,

希望你的启动文件(app.js)中有这样的东西,

代码语言:javascript
复制
var app = module.exports = express();

routes.js

代码语言:javascript
复制
//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,

代码语言:javascript
复制
//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);
 })   
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40069171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档