我是MEAN堆栈的新手,所以我正在阅读教程,很明显并非所有人都使用相同的逻辑。 但现在我被困在这两个例子上
示例一
// server.js
var express = require('express'),
app = express(),
port = 1337;
// indicating view folder
app.set('views', './views');
// indicating view engine
app.set('view engine', 'ejs');
// adding routes
require('./routes/index.js')(app);
require('./routes/user.js')(app);
//
app.listen(port);
module.exports = app;
./routes/index.js
module.exports = function(app) {
// show indix view
app.get('/', function(req, res) {
res.render('index', {
title: 'Index page',
});
});
};
以上我们使用get
中的app
方法(express
的实例)
./routes/user.js
module.exports = function(app) {
// showing user page
app.route('/users').get(function(req, res) {
res.render('user', {
title: 'User page'
});
});
};
上面我们使用route
express
方法,然后将get
绑定到它
所以当应用程序运行时,我会访问localhost:1337
索引页面
当调用localhost:1337/user
时,用户页面被称为
示例二
现在,当我们使用express myapp
命令时,此示例具有一些不同的逻辑
我们有主app.js
var express = require('express');
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use('/', routes);
app.use('/users', users);
app.listen(1337);
module.exports = app;
如您所见,我们首先需要index
和user
路径文件
然后我们使用app.use
命令设置路由。
./routes/index.js
我们获取var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;
的方法router
,然后将express
方法绑定到它
所以我的问题是,当我提交get
并致电app.use('/', routes);
时,我会收到错误消息
但是我们已经在localhost:1337
中使用路由器来显示索引页面。
这应该按照第一个例子工作。
编辑错误消息
./routes/index.js
我有这个代码来处理错误
Error: Not Found
at app.use.res.render.message (/home/vagrant/meanstack/myapp/app.js:30:15)
at Layer.handle [as handle_request] (/home/vagrant/meanstack/myapp/node_modules/express/lib/router/layer.js:82:5)
at trim_prefix (/home/vagrant/meanstack/myapp/node_modules/express/lib/router/index.js:302:13)
at /home/vagrant/meanstack/myapp/node_modules/express/lib/router/index.js:270:7
at Function.proto.process_params (/home/vagrant/meanstack/myapp/node_modules/express/lib/router/index.js:321:12)
at next (/home/vagrant/meanstack/myapp/node_modules/express/lib/router/index.js:261:10)
at SendStream.error (/home/vagrant/meanstack/myapp/node_modules/express/node_modules/serve-static/index.js:107:7)
at SendStream.emit (events.js:95:17)
at SendStream.error (/home/vagrant/meanstack/myapp/node_modules/express/node_modules/send/index.js:244:17)
at SendStream.onStatError (/home/vagrant/meanstack/myapp/node_modules/express/node_modules/send/index.js:340:48)
现在当我评论此代码并发表评论app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
})
并运行server.js
我在运行app.use('/', routes);
localhost:1337
如果仍然看不到错误,请在文件夹中尝试Cannot GET /
并创建新文件express app
并添加以下代码并运行server.js
node server.js
答案 0 :(得分:10)
我运行了express-generator,用你提供的代码创建了一个新文件server.js。在击中我的本地主机:1337我得到了一个“无法获得/'错误。然后我在server.js
中取消注释了这一行app.use('/', routes);
它有效。
编辑:
你需要调用app.use(' /',routes)才能使路由处理正常工作的原因是你打电话时
var app = express();
此时,应用程序'变量包含对内存中快捷对象的引用。打电话时的含义
var router = express.Router();
此时路由器是独立对象。路由器没有引用您创建的应用程序,这意味着当您使用route.get()注册GET路由时,它不会影响您的应用程序实例。因此,当您点击localhost:1337时,在注册路由之前会收到错误。
要使用您的应用注册您的路由器,您需要导出并要求您的路由器,并注册
routes = require('path/to/router')
app.use('/', routes)
您的第一个示例工作的原因是因为在这种情况下,您使用app.get()直接在您的应用实例中注册路由处理程序