简体   繁体   中英

receiveing 404 error when trying to send a POST request

im trying to setup an API using node.js and in my app.js class im handling request errors where i return a 404 in case something goes wrong, now thats my problem, i can't see how am i requesting anything wrong, i am still receiving 404 error, im trying to send a post request to my API exactly like this:

{
    "name":"Harry Potter 5",
    "price":"12.99"
}

then i get this

错误

Here's my app.js

const express = require('express');
const app = express();
const morgan = require('morgan');
const productRoutes = require('./api/routes/product');
const orderRoutes = require('./api/routes/order');
const bodyParser = require('body-parser');

app.use(morgan('dev'));
app.use(bodyParser.urlencoded({
    extended:false
}));
app.use(bodyParser.json());
app.use((req, res, next) => {
    const error = new Error("Not found");
    error.status = 404;
    next(error);
  });

  app.use((error, req, res, next) => {
    res.status(error.status || 500);
    res.json({
      error: {
        message: error.message
      }
    });
  });
app.use('/products', productRoutes);
app.use('/orders', orderRoutes);

module.exports = app;

Here's my product.js

const express = require('express');
const router = express.Router();

router.get('/', (req, res, next) => {
    res.status(200).json({
        message: 'Handling GET requests to /products'
    });
});

router.post('/', (req, res, next) => {
    const product = {
        name: req.body.name,
        price: req.body.price
    };
    res.status(201).json({
        message: 'Handling POST requests to /products',
        createdProduct: product
    });
});

router.get('/:productId', (req, res, next) => {
    const id = req.params.productId;
    if (id === 'special') {
        res.status(200).json({
            message: 'You discovered the special ID',
            id: id
        });
    } else {
        res.status(200).json({
            message: 'You passed an ID'
        });
    }
});

router.patch('/:productId', (req, res, next) => {
    res.status(200).json({
        message: 'Updated product!'
    });
});

router.delete('/:productId', (req, res, next) => {
    res.status(200).json({
        message: 'Deleted product!'
    });
});

module.exports = router;

It's because you are setting everything to error out :)

See the documentation from here - from the provided link:

Writing error handlers Define error-handling middleware functions in the same way as other middleware functions, except error-handling functions have four arguments instead of three: (err, req, res, next). For example:

 // pay attention to err param app.use(function (err, req, res, next) { console.error(err.stack)` res.status(500).send('Something broke!') }) 

In your code you have this bit:

app.use((req, res, next) => {
    const error = new Error("Not found");
    error.status = 404;
    next(error);
  });

which tells express that every request should be responded with a 404. You should either make it a proper error handler, or remove it.

This is because any request execute the 404 handler.

Look at this shorten version of your code:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({
    extended:false
}));
app.use(bodyParser.json());

app.use((req, res, next) => {
  console.log("Got into 404 handler");

  const error = new Error("Not found");
  error.status = 404;
  next(error);
});

app.use((error, req, res, next) => {
  console.log("Got into 500 handler");

  res.status(error.status || 500);
  res.json({
    error: {
      message: error.message
    }
  });
});
app.use('/products', (req, res, next) => {
  console.log("Got into 200 handler");

  res.status(200).end();
});

app.listen(8080);

It prints "Got into 404 handler" at each request. Now, if you comment out the 404 callback this way: all requests go through the 500 and 200 callbacks:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({
    extended:false
}));
app.use(bodyParser.json());

/* there used to be the 404 callback here */

app.use((error, req, res, next) => {
  console.log("Got into 500 handler");

  res.status(error.status || 500);
  res.json({
    error: {
      message: error.message
    }
  });
});
app.use('/products', (req, res, next) => {
  console.log("Got into 200 handler");

  res.status(200).end();
});

app.listen(8080);

Now in your specific problem, the code below would work (I just swapped the order of the handlers):

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({
    extended:false
}));
app.use(bodyParser.json());

app.use('/products', (req, res, next) => {
  console.log("Got into 200 handler");

  res.status(200).end();
});

app.use((req, res, next) => {
  console.log("Got into 404 handler");

  const error = new Error("Not found");
  error.status = 404;
  next(error);
});

app.use((error, req, res, next) => {
  console.log("Got into 500 handler");

  res.status(error.status || 500);
  res.json({
    error: {
      message: error.message
    }
  });
});


app.listen(8080);

Hope this helps.

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