最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - expressjs router not working - Stack Overflow

programmeradmin3浏览0评论

I am new to MEAN stack, so i am going through tutorials and it pretty clear that not all people use same logic. But now i am stuck on these two examples

Example One

// 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',
            });
    });
};

above we are using get method from app (which is instance of express)

./routes/user.js
module.exports = function(app) {
    // showing user page
    app.route('/users').get(function(req, res) {
            res.render('user', {
                title: 'User page'
            });
    });
};

above we are using route method of express and then bind get to it

so when the app is running, and i access localhost:1337 index page is called and when localhost:1337/user is called user page is called

Example two Now when we use express myapp command, this example has some different logic

we have main 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;

As you can see first we require index and user route files required and then we use app.use command to set routes.

in ./routes/index.js file

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;

we get method router of express and then bind get method to it

so my question is, when i commit app.use('/', routes); and call localhost:1337 i get error but we have already using router in ./routes/index.js to show index page. this should work according to first example.

EDIT error msg

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)

i had this code to handle error

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

now when i comment this code and comment app.use('/', routes); and run the server.js

i get this when i run localhost:1337

Cannot GET / 

if you still cannot see the error, try express app in folder and create a new file server.js and add below code and run 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");

I am new to MEAN stack, so i am going through tutorials and it pretty clear that not all people use same logic. But now i am stuck on these two examples

Example One

// 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',
            });
    });
};

above we are using get method from app (which is instance of express)

./routes/user.js
module.exports = function(app) {
    // showing user page
    app.route('/users').get(function(req, res) {
            res.render('user', {
                title: 'User page'
            });
    });
};

above we are using route method of express and then bind get to it

so when the app is running, and i access localhost:1337 index page is called and when localhost:1337/user is called user page is called

Example two Now when we use express myapp command, this example has some different logic

we have main 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;

As you can see first we require index and user route files required and then we use app.use command to set routes.

in ./routes/index.js file

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;

we get method router of express and then bind get method to it

so my question is, when i commit app.use('/', routes); and call localhost:1337 i get error but we have already using router in ./routes/index.js to show index page. this should work according to first example.

EDIT error msg

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)

i had this code to handle error

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

now when i comment this code and comment app.use('/', routes); and run the server.js

i get this when i run localhost:1337

Cannot GET / 

if you still cannot see the error, try express app in folder and create a new file server.js and add below code and run 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");
Share Improve this question edited Jan 29, 2015 at 14:40 Iori asked Jan 28, 2015 at 15:43 IoriIori 6601 gold badge10 silver badges19 bronze badges 7
  • What's the error message? – Yuri Zarubin Commented Jan 28, 2015 at 18:00
  • In your example #1, you're using ejs as the view engine, and jade in example #2. Is that on purpose? – Yuri Zarubin Commented Jan 28, 2015 at 18:47
  • yes, i dont think that matters – Iori Commented Jan 28, 2015 at 19:11
  • There does not appear to be anything wrong with your code, it worked fine on my machine. What version of express are you using? Look in your package.json file – Yuri Zarubin Commented Jan 28, 2015 at 19:39
  • try to commit app.use('/', routes); and call localhost:1337 in second example – Iori Commented Jan 28, 2015 at 20:03
 |  Show 2 more comments

2 Answers 2

Reset to default 17

I ran express-generator, created a new file server.js with the code you provided. Upon hitting my localhost:1337 I got a 'CANNOT GET /' error. I then uncommented this line inside server.js

app.use('/', routes);

And it worked.

EDIT:

The reason why you need to call app.use('/', routes) for the route handling to work is because when you call

var app = express();

At this point, the 'app' variable contains a reference to your express object in memory. Meaning when you call

var router = express.Router(); 

Router at this point is standalone object. Router has no reference to the app you created, meaning when you register your GET route with route.get(), it does not affect your app instance of express. Hence when you hit localhost:1337, you get an error until you register the route.

In order to register your router with your app, you need to export and require your router, and register it with

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

The reason why your first example worked, is because in that case, you were registering the route handler directly with your app instance, using app.get()

router.get('/todos/active', findByStatusData); set the path this way, suppose i faced problem when i use just router.get('/active', findByStatusData); that it shown error,

and also use in app.use("/todo",todoHandler).So now my correct path is router.get("/todo/todos/active") and it worked my cased but when i used router.get('/active', findByStatusData) that time i get some unknown error.

发布评论

评论列表(0)

  1. 暂无评论