ошибка 404 при отправке запроса POST - PullRequest
0 голосов
/ 16 декабря 2018

я пытаюсь настроить API с помощью node.js и в своем классе app.js я обрабатываю ошибки запроса, где я возвращаю 404 в случае, если что-то идет не так, теперь это моя проблема, я не вижу, как я запрашиваю что-либонеправильно, я все еще получаю сообщение об ошибке 404, я пытаюсь отправить запрос на публикацию в мой API в точности так:

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

, тогда я получаю это

error

Вот мой 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;

Вот мой 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;

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Это происходит потому, что любой запрос выполняет обработчик 404.

Посмотрите на эту сокращенную версию вашего кода:

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

При каждом запросе выводится «Получил обработчик 404».Теперь, если вы закомментируете обратный вызов 404 следующим образом: все запросы проходят через обратные вызовы 500 и 200:

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

Теперь в вашей конкретной проблеме будет работать код ниже (я просто поменял местами порядокобработчики):

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

Надеюсь, это поможет.

0 голосов
/ 16 декабря 2018

Это потому, что вы устанавливаете все на ошибку:)

См. Документацию от здесь - по предоставленной ссылке:

Запись обработчиков ошибок ОпределитьФункции промежуточного программного обеспечения для обработки ошибок аналогичны другим функциям промежуточного программного обеспечения, за исключением того, что функции для обработки ошибок имеют четыре аргумента вместо трех: (err, req, res, next).Например:

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

В вашем коде у вас есть этот бит:

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

, который говорит express, что на каждый запрос следует ответить 404. Вы должны либо сделать этоправильный обработчик ошибок, или удалите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...