简体   繁体   中英

Express Route 404

I'm having trouble with my node.js express routes. I'm really new to it and I can't see my mistake. I'm always getting a 404 Error when requesting localhost:2700/api/subs, but I think that my route is correct, isn't it? Can anybody see a mistake?

Beginning of the Error Message:

 Error: Not Found at ****/app.js:45:13 at Layer.handle [as handle_request] (****/node_modules/express/lib/router/layer.js:95:5) 

Here is the app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

const mongoose = require('mongoose');

// establish connection to the Database
mongoose.connect('mongodb://localhost/test', {
  useMongoClient: true
});

mongoose.connection.once('open', function() {
  console.log('Connection to Database has been established..');
}).on('error', function(error){
  console.log(error);
});


var index = require('./routes/index');
var users = require('./routes/users');
Subscriber = require('./routes/subscriber.js');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

app.get('/api/subs', function(req, res){
    Subscriber.getSubscribers(function(err, subscribers){
        if(err){
            throw err;
        }
        res.json(subscribers);
    });
});

// ... here is a function which creates the database objects and saves         
//       them. took it out for better overview....

app.listen(2700, function(){
  console.log("Listening on Port 2700")
});

module.exports = app;

and the subscriber.js which is in the subdirectory ./routes:

const mongoose = require('mongoose');

var subscriberSchema = mongoose.Schema({
    //seqnr shall go here. dunno how to declare integer x)
    nr: Number,
    name: String,
    email: String,
    uLink: String,
    anwalt: String
});

var Subscriber = module.exports = mongoose.model('Subscriber', subscriberSchema);

//get Subscriber
module.exports.getSubscribers = function(callback, limit){
    Subscriber.find(callback).limit(limit);
};

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;

You need to put your 404 app.use after all the other uses, otherwise it will ignore the api/subs after it.

Also, this bit will never run, because it also comes after an api.use that will always throw an error:

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

Plus, you really shouldn't be throwing errors for 404s. It should tell the end user the page doesn't exist, but it shouldn't crash your script.

Also I agree with the other answer that says you should move those code blocks into separate router files, but that's more for good practice and structuring than for this particular bug.

Try putting it in a separate file and including it where you do with other routes, before the 404 handler

app.use('/', index);
app.use('/users', users);

So... make a subs.js route

var express = require('express');
var router = express.Router();
Subscriber = require('./routes/subscriber.js');

router.get('/', function(req, res){
    Subscriber.getSubscribers(function(err, subscribers){
        if(err){
            throw err;
        }
        res.json(subscribers);
    });
});

module.exports = router;

Then include it in your app.js

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM