expressjs路由器无法正常工作

Ior*_*ori 5 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',
            });
    });
};
Run Code Online (Sandbox Code Playgroud)

上面我们使用的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'
            });
    });
};
Run Code Online (Sandbox Code Playgroud)

上面我们使用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;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,首先我们需要indexuser路由所需的文件,然后我们使用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;
Run Code Online (Sandbox Code Playgroud)

我们得到的方法routerexpress,然后绑定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)
Run Code Online (Sandbox Code Playgroud)

我有这个代码来处理错误

app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
})
Run Code Online (Sandbox Code Playgroud)

现在,当我评论此代码和评论 app.use('/', routes);并运行server.js

我跑的时候会得到这个 localhost:1337

Cannot GET / 
Run Code Online (Sandbox Code Playgroud)

如果仍然看不到错误,请尝试express app在文件夹中创建一个新文件server.js并添加以下代码并运行node server.js

var express = require('express');
var path = require('path');
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;
console.log(" call 192.168.33.33:1337");
Run Code Online (Sandbox Code Playgroud)

Yur*_*bin 10

我运行了express-generator,用你提供的代码创建了一个新的文件server.js.在点击我的localhost时:1337我收到了"无法获取/"错误.然后我在server.js中取消注释了这一行

app.use('/', routes);
Run Code Online (Sandbox Code Playgroud)

它奏效了.

编辑:

你需要调用app.use('/',routes)来使路由处理工作的原因是你打电话的时候

var app = express();
Run Code Online (Sandbox Code Playgroud)

此时,'app'变量包含对内存中快捷对象的引用.你打电话的意思

var router = express.Router(); 
Run Code Online (Sandbox Code Playgroud)

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

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

routes = require('path/to/router')
app.use('/', routes)
Run Code Online (Sandbox Code Playgroud)

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