Javascript 如何使用/Express模块化Node.JS
我正在尝试模块化我的node.js应用程序(使用express framework)。我遇到的麻烦是在设置路线时 我再也无法提取发送给邮局的数据了。(请求主体未定义)。如果所有文件都在同一个文件中,则可以正常工作。我在这里做错了什么?在node.js中模块化代码的最佳方法是什么 我的app.jsJavascript 如何使用/Express模块化Node.JS,javascript,node.js,express,Javascript,Node.js,Express,我正在尝试模块化我的node.js应用程序(使用express framework)。我遇到的麻烦是在设置路线时 我再也无法提取发送给邮局的数据了。(请求主体未定义)。如果所有文件都在同一个文件中,则可以正常工作。我在这里做错了什么?在node.js中模块化代码的最佳方法是什么 我的app.js require('./routes.js').setRoutes(app); 我的路线.js exports.setRoutes = function(app){ app.post('/ask'
require('./routes.js').setRoutes(app);
我的路线.js
exports.setRoutes = function(app){
app.post('/ask', function(req, res, next){
time = new Date();
var newQuestion = {title: req.body.title, time: time.getTime(), vote:1};
app.questions.push(newQuestion);
res.render('index', {
locals: {
title: 'Questions',
questions: app.questions
}
});
});
我的问题是我以错误的方式声明了应用程序。而不是
var app=module.exports=express.createServer()代码>,它应该是app=express.createServer()代码>
然后我在app.js中需要做的就是require('./routes.js')代码>。现在routes文件可以访问app变量,现在我可以在routes文件中正常声明路由
(routes.js)
更好的方法:
创建包含以下内容的routes.js文件:
var index = require('./controllers/index');
module.exports = function(app) {
app.all('/', index.index);
}
然后,在server.js中(或以启动服务器的方式),您需要这样做:
require('./routes')(app);
这样,您就不会创建全局变量,这些全局变量会带来一系列问题(可测试性、冲突等)我的全局“应用程序”(通常)。如果你知道这个应用程序不会是require()d,如果你不笨拙,那么使用它会容易得多,我知道有人已经回答了,但我还是要做以下几点
app.js:
fs.readdir('./routes', function(err, files){
files.forEach(function(fn) {
if(!/\.js$/.test(fn)) return;
require('./routes/' + fn)(app);
});
});
./routes/index.js:
module.exports = function(app) {
var data_dir = app.get('data-dir');
app.get('/', function(req, res){
res.render('index', {title: 'yay title'}
});
}
也许有人会觉得这种方法很有用。app.js中的示例
var users = require('./lib/users'); //this is your own module
app.use(users);
然后,在lib/users文件夹中创建文件(index.js、user.ejs等)。使用index.js进行默认模块加载
//index.js
var express=需要(“express”);
var app=module.exports=express()
我在这里举了一个Modular node.jes+Boostrap的例子:或者在这里做一个导师这是一个糟糕的做法,因为你将应用程序实例化为一个全局变量。最好将其传递到routes.js文件中(例如,在接受应用程序变量的routes.js中导出init函数)。了解一下为什么快速安装提供的默认设置是这种“错误做法”会很好:(很明显,globals不太好,但这是我们提供的模板。这是更好的方法。多亏了你,我已经在我的项目中开始这样做了!这种方法很好,我在@ctide上找到了一个更完整的例子,你如何从index controller访问应用程序?我不,你不应该这样做。你是什么您试图在需要webserver对象的路由中完成吗?index函数将接收req、res和next参数,这些参数应该是您所需要的。为什么是app.all()而不是app.get()?感谢您的回答!使用全局“app”时应该避免什么样的事情?重新分配它:D如果您的应用围绕“应用程序”作为资源,您可能会使用“var app="很多时候,我绝对不会建议您这样做。如果fs.readdir
是异步的,请注意require
是一个同步函数。因此每次运行应用程序时,模块的执行顺序都会有所不同。但是您可以在forEach
之前对文件数组进行排序,以确定它。您也可以异步y将文件预加载到require.cache
,以便在应用程序需要大量重新启动时更快地启动。
var users = require('./lib/users'); //this is your own module
app.use(users);
app.set('views',__dirname);
app.set('view engine','ejs');
app.get('/users',function(req,res){
//do stuffs here
});