首页 > 解决方案 > '无法获取 /api/items'

问题描述

使用 MERN 应用程序来了解它是如何工作的,但我一直在试图让我的路线显示。我没有收到任何其他错误,如果我使用 simple app.get('/'),我可以看到就好了;似乎我定义的路线由于某种原因没有被识别。

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);
};

我遵循这个这个作为起点。不确定我遗漏了什么或为什么它无法检索我的 POST 路线。

标签: node.jsexpress

解决方案


您标题中的错误:

Cannot GET /api/items

意味着它是一个 GET 请求/api/items。但是,您没有该路由的 GET 处理程序。对于使用这两行代码定义的路由,您只有一个 POST 处理程序:

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

因此,您显然需要将该路线上的测试更改为 POST,而不是 GET,并且 POST 将期待一个带有图标数据的正文部分。


如果您想确切了解路由器的内容(出于调试/故障排除的目的),您可以在将路由器声明为您在路由器上注册的第一个项目后立即添加它。

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

推荐阅读