Home > Mobile >  'Cannot GET /api/items'
'Cannot GET /api/items'

Time:10-31

Working on a MERN application as a way to learn how it all works, but I am stuck trying to get my routes to display. I don't get any other errors, and if I use a simple app.get('/'), I am able to see that just fine; it seems that the routes I have defined are not being recognized for some reason.

require('dotenv').config();

const express = require('express');
const cors = require('cors');

const app = express();
const port = process.env.PORT;

const options = {
    origin: 'http://localhost:8081'
}

app.use(cors(options));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

const db = require('./models');
db.mongoose
    .connect(db.url, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    })
    .then(() => {
        console.log('Successfully connected.');
    })
    .catch((error) =>{
        console.log(`Connection failed. Error: ${error}`);
        process.exit();
    }
);

require('./routes/items.routes')(app)

app.listen(port, () => {
    console.log(`Listening at localhost:${port}`);
});
const multer = require('multer');
const dir = './public/';

const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, dir);
    },
    filename: (req, file, cb) => {
        const fileName = file.originalname.toLowerCase().split(' ').join('-');
        cb(null, fileName   '-'   Date.now());
    }
});

var upload = multer({
    storage: storage,
    fileFilter: (req, file, cb) => {
        if (file.mimetype == 'image/png' || file.mimetype == 'image/jpg' || file.mimetype == 'image/jpeg') {
            cb(null, true);
        } else {
            cb(null, false);
            return cb(new Error('Invalid file type.'));
        }
    }
});

module.exports = app => {
    const items = require('../controllers/items.controller');

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

    router.post('/', upload.single('icon'), items.create);
    router.delete('/:id', items.delete);

    app.use('/api/items', router);
};

I followed this and this as a start point. Unsure what I am missing or why it is unable to retrieve my POST route.

CodePudding user response:

The error in your title:

Cannot GET /api/items

means it is a GET request to /api/items. But, you don't have a GET handler for that route. You only have a POST handler for that route defined with these two lines of code:

router.post('/', upload.single('icon'), items.create);
app.use('/api/items', router);

So, you apparently need to change your test on that route to a POST, not a GET and the POST will be expecting a body part with the data for an icon in it.


If you want to see exactly what is getting to your router (for debugging/troubleshooting purposes), you can add this right after you declare the router as the first item you register on the router.

router.use((req, res, next) => {
    console.log(`In router: ${req.method}:${req.originalUrl}`);
    next();
});
  • Related