I have a plain node express webserver that send MongoDB Atlas a post request. I use mongooose.
Before do this there is some express-validators work.
Two API key used in this project. Thats enabled and work. Of course not share here...
I test with Postman.
This code from Node and MongoDB expert.
If i change MongoDB cluster not help.
I got two error:
- Validation error: Invalid inputs passed, please check your data 422
If I comment out validation got different error:
- Other error on post route: Creating place failed, please try again 500
app.js
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const placesRoutes = require('./routes/places-routes');
const usersRoutes = require('./routes/users-routes');
const HttpError = require('./models/http-error');
const app = express();
app.use(bodyParser.json());
app.use('/api/places', placesRoutes); // => /api/places...
app.use('/api/users', usersRoutes);
app.use((req, res, next) => {
const error = new HttpError('Could not find this route.', 404);
throw error;
});
app.use((error, req, res, next) => {
if (res.headerSent) {
return next(error);
}
res.status(error.code || 500);
res.json({ message: error.message || 'An unknown error occurred!' });
});
mongoose
.connect('xxxx')
.then(() => {
app.listen(5000);
})
.catch(err => {
console.log(err);
});
places-routes.js
const express = require('express');
const { check } = require('express-validator');
const placesControllers = require('../controllers/places-controllers');
const router = express.Router();
router.get('/:pid', placesControllers.getPlaceById);
router.get('/user/:uid', placesControllers.getPlacesByUserId);
router.post(
'/',
[
// check('title')
// .not()
// .isEmpty(),
// check('description').isLength({ min: 5 }),
// check('address')
// .not()
// .isEmpty()
],
placesControllers.createPlace
);
router.patch(
'/:pid',
[
check('title')
.not()
.isEmpty(),
check('description').isLength({ min: 5 })
],
placesControllers.updatePlace
);
router.delete('/:pid', placesControllers.deletePlace);
module.exports = router;
places-controllers.js
const uuid = require('uuid/v4');
const { validationResult } = require('express-validator');
const HttpError = require('../models/http-error');
const getCoordsForAddress = require('../util/location');
const Place = require('../models/place');
let DUMMY_PLACES = [
{
id: 'p1',
title: 'Empire State Building',
description: 'One of the most famous sky scrapers in the world!',
location: {
lat: 40.7484474,
lng: -73.9871516
},
address: '20 W 34th St, New York, NY 10001',
creator: 'u1'
}
];
const getPlaceById = (req, res, next) => {
const placeId = req.params.pid; // { pid: 'p1' }
const place = DUMMY_PLACES.find(p => {
return p.id === placeId;
});
if (!place) {
throw new HttpError('Could not find a place for the provided id.', 404);
}
res.json({ place }); // => { place } => { place: place }
};
// function getPlaceById() { ... }
// const getPlaceById = function() { ... }
const getPlacesByUserId = (req, res, next) => {
const userId = req.params.uid;
const places = DUMMY_PLACES.filter(p => {
return p.creator === userId;
});
if (!places || places.length === 0) {
return next(
new HttpError('Could not find places for the provided user id.', 404)
);
}
res.json({ places });
};
const createPlace = async (req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return next(
new HttpError('Invalid inputs passed, please check your data.', 422)
);
}
const { title, description, address, creator } = req.body;
let coordinates;
try {
coordinates = await getCoordsForAddress(address);
} catch (error) {
return next(error);
}
// const title = req.body.title;
const createdPlace = new Place({
title,
description,
address,
location: coordinates,
image: 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/10/Empire_State_Building_(aerial_view).jpg/400px-Empire_State_Building_(aerial_view).jpg',
creator
});
try {
await createdPlace.save();
} catch (err) {
const error = new HttpError(
'Creating place failed, please try again.',
500
);
return next(error);
}
res.status(201).json({ place: createdPlace });
};
const updatePlace = (req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
throw new HttpError('Invalid inputs passed, please check your data.', 422);
}
const { title, description } = req.body;
const placeId = req.params.pid;
const updatedPlace = { ...DUMMY_PLACES.find(p => p.id === placeId) };
const placeIndex = DUMMY_PLACES.findIndex(p => p.id === placeId);
updatedPlace.title = title;
updatedPlace.description = description;
DUMMY_PLACES[placeIndex] = updatedPlace;
res.status(200).json({ place: updatedPlace });
};
const deletePlace = (req, res, next) => {
const placeId = req.params.pid;
if (!DUMMY_PLACES.find(p => p.id === placeId)) {
throw new HttpError('Could not find a place for that id.', 404);
}
DUMMY_PLACES = DUMMY_PLACES.filter(p => p.id !== placeId);
res.status(200).json({ message: 'Deleted place.' });
};
exports.getPlaceById = getPlaceById;
exports.getPlacesByUserId = getPlacesByUserId;
exports.createPlace = createPlace;
exports.updatePlace = updatePlace;
exports.deletePlace = deletePlace;
package.json
{
"name": "backend",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "nodemon app.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.19.0",
"body-parser": "^1.19.0",
"express": "^4.17.1",
"express-validator": "^6.2.0",
"mongoose": "^5.7.8",
"uuid": "^3.3.3"
},
"devDependencies": {
"nodemon": "^1.19.4"
}
}
CodePudding user response:
Firstly use this middleware in app.js
, and remove body-parser.
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
It parses your request and you get all values...
CodePudding user response:
Only a plus ":" sign by title
wrong
{
"title:": "Empire State Building",
"description": "A very famous building in NY",
"address": "20 W 34th St, New York, NY 10001",
"creator": "u2"
}
and the good:
{
"title": "Empire State Building",
"description": "A very famous building in NY",
"address": "20 W 34th St, New York, NY 10001",
"creator": "u2"
}