expressjs路由器无法正常工作

时间:2015-01-28 15:43:58

标签: javascript node.js express

我是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;

如您所见,我们首先需要indexuser路径文件 然后我们使用app.use命令设置路由。

<{1>}文件中的

./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

1 个答案:

答案 0 :(得分:10)

我运行了express-generator,用你提供的代码创建了一个新文件server.js。在击中我的本地主机:1337我得到了一个“无法获得/&#39;错误。然后我在server.js

中取消注释了这一行
app.use('/', routes);

它有效。

编辑:

你需要调用app.use(&#39; /&#39;,routes)才能使路由处理正常工作的原因是你打电话时

var app = express();

此时,应用程序&#39;变量包含对内存中快捷对象的引用。打电话时的含义

var router = express.Router(); 

此时路由器是独立对象。路由器没有引用您创建的应用程序,这意味着当您使用route.get()注册GET路由时,它不会影响您的应用程序实例。因此,当您点击localhost:1337时,在注册路由之前会收到错误。

要使用您的应用注册您的路由器,您需要导出并要求您的路由器,并注册

routes = require('path/to/router')
app.use('/', routes)

您的第一个示例工作的原因是因为在这种情况下,您使用app.get()直接在您的应用实例中注册路由处理程序