2016-10-16 63 views
0

我知道有很多類似於我的問題,但我無法找到最佳解決方案。 我正在用node和rethinkdb創建一個web應用程序。我想組織不同的js文件(模塊),以便每個文件都有特定的任務。 我有這個查詢結果必須傳遞到routes.js文件的query.js文件。 我試過用以下方法實現這個。將函數或變量導出到node.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是示出可以不屬於R ead未定義的屬性ID。

另外我想知道有沒有辦法直接傳遞變量,而不是使用函數,然後調用它。 如果解決方案很明顯,我很抱歉。

總結我希望能夠從routes.js文件訪問對象的查詢結果。

+0

由於'exp orts.clist1'是一種異步方法,你不能指望結果被打印在下一行。請按照下面的答案執行代碼。 – Aruna

+0

由於'query.js'是異步執行的,我也更新了這個,以便正確處理這個問題。請檢查現在更新。 – Aruna

回答

0

注:由於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); 
}) 
}; 
+0

由於'query.js'異步執行操作,我也更新了它,以便正確處理。請檢查現在更新。 – Aruna

+1

另一種方法是,您從companyList函數返回承諾,然後您可以在數據庫返回時發送響應,例如, router.get('/ company',function(req,res){ query.companyList(...)。then(result => { res.render('pages/company',{ clist:result , x:Object.keys(結果)。長度 }); }); }); – Dymos

+0

@Dymos是的,這是正確的:-) – Aruna

相關問題