Express.js Handle unmached routes

一曲冷凌霜 提交于 2021-02-04 19:58:19

问题


Fellows I develop a Rest API and I want when a route does not exist to send a custom message instead of an html one that express.js sends by default. As fas as I searched I could not find a way to do that.

I tried to do:

  app.all("*",function(req,res){
     res.status(404)
     res.header("Content Type","application/json")
     res.end(JSON.stringify({message:"Route not found"}))
  });

But it matches and all already implemented methods. I want only the unmached one to get handled by my app.

Edit 1

For each enndpoint I create a seperate file having the following content: eg. myendpoint.js

module.exports=function(express){

   var endpoint="/endpoint"

   express.get(endpoint,function(req,res){
      res.end("Getting data other message")
   }).post(endpoint.function(req,res){
      res.end("Getting data other message")
   }).all(endpoint,function(req,res){
      res.status(501)
      res.end("You cannot "+res.method+" to "+endpoint)
   })
}

An in my main file I use:

var endpoint=require('myendpoint.js')
var MyEndpointController=endpoint(app)
app.all("*",function(req,res){
   res.status(404)
   res.header("Content Type","application/json")
   res.end(JSON.stringify({message:"Route not found"}))
});

回答1:


1.Declare all of your routes

2.Define unmatched route request to error respose AT the END.

This you have to set it in the app. (app.use) not in the routes.

Server.js

//Import require modules
var express = require('express');
var bodyParser = require('body-parser');

// define our app using express
var app = express();

// this will help us to read POST data.
app.use(bodyParser.urlencoded({ extended: true }));

app.use(bodyParser.json());

var port = process.env.PORT || 8081;    

// instance of express Router
var router = express.Router(); 

// default route to make sure , it works.
router.get('/', function(req, res) {
    res.json({ message: 'hooray! welcome to our api!' });   
});

// test route to make sure , it works.
router.get('/test', function(req, res) {
    res.json({ message: 'Testing!' });   
});


// all our routes will be prefixed with /api
app.use('/api', router);

// this is default in case of unmatched routes
app.use(function(req, res) {
// Invalid request
      res.json({
        error: {
          'name':'Error',
          'status':404,
          'message':'Invalid Request',
          'statusCode':404,
          'stack':'http://localhost:8081/'
        },
         message: 'Testing!'
      });
});

// state the server
app.listen(port);

console.log('Server listening on port ' + port);

Please note : I have prefix '/api' in my routes.

Please try http://localhost:8081/api

You will see '{"message":"hooray! welcome to our api!"}'

When you try http://localhost:8081/api4545 - which is not a valid route

You would see the error message.




回答2:


Can't post as comment (reputation is too low ...) but did you define this route after all your other paths ?

The order is really important, you should first define all your routes and then have this one.




回答3:


First you need to define all existing routes then at last you have to define no route. order is very important

 // Defining main template navigations(sample routes)

 app.use('/',express.static(__dirname + "/views/index.html"));
 app.use('/app',express.static(__dirname + "/views/app.html"));
 app.use('/api',express.static(__dirname + "/views/api.html"));
 app.use('/uploads',express.static(path.join(__dirname, 'static/uploads')));

 //If no route is matched by now, it must be a 404

 app.use(function(req, res, next) {
  res.status(404);
  res.json({status:404,title:"Not Found",msg:"Route not found"});
  next();
 });


来源:https://stackoverflow.com/questions/44539210/express-js-handle-unmached-routes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!