[英]Export functions or variables to another module in node.js
我知道有很多与我相似的问题,但我找不到最佳解决方案。 我正在使用node和rethinkdb创建一个Web应用程序。 我想组织不同的js文件(模块),以便每个都有特定的任务。 我有这个query.js文件,其查询结果必须传递到route.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中的控制台日志显示无法读取未定义的属性ID。
我也想知道是否有一种方法可以直接传递变量,而不是使用函数然后调用它。 如果解决方案显而易见,我深表歉意。
总之,我希望查询结果是可以从routes.js文件访问的对象。
注意:由于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);
})
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.