将函数或变量导出到 node.js 中的另一个模块
Export functions or variables to another module in node.js
我知道有很多类似我的问题,但我找不到最佳解决方案。
我正在使用节点和 rethinkdb 创建一个网络应用程序。我想组织不同的 js 文件(模块),以便每个文件都有特定的任务。
我有这个 query.js 文件,其查询结果必须传递给 routes.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)
您必须注册一个中间件才能使其正常工作,否则,查询将仅在 express 服务器启动时调用,而不是在每次请求时调用。
所以你可以这样做,
希望你的启动文件中有这样的东西 (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);
})
};
我知道有很多类似我的问题,但我找不到最佳解决方案。 我正在使用节点和 rethinkdb 创建一个网络应用程序。我想组织不同的 js 文件(模块),以便每个文件都有特定的任务。 我有这个 query.js 文件,其查询结果必须传递给 routes.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)
您必须注册一个中间件才能使其正常工作,否则,查询将仅在 express 服务器启动时调用,而不是在每次请求时调用。
所以你可以这样做,
希望你的启动文件中有这样的东西 (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);
})
};