skip to Main Content

So this is the POST request for /products, when a form is submitted, this function will be invoked. I use a try-catch to catch the error if the form is submitted wrongly.

This is my Schema.

const productSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    price: {
        type: Number,
        required: true,
        min: 0
    },
    category: {
        type: String,
        lowercase: true,
        enum: ['fruit', 'vegetable', 'dairy']
    }
});

The error is with the newProduct.save() line, so if I submit a form that goes against the Schema, like not having a name, I will get an error instead of getting redirected to the page.

app.post('/products', (req, res, next) => {
    try {
        const newProduct = new Product(req.body);
        newProduct.save();
        res.redirect(`/products/${newProduct._id}`);
    }
    catch (e) {
        next(e);
    }
});

This is my error handler.

app.use((err, req, res, next) => {
    const { status = 500, message = 'Something went wrong!' } = err;
    res.status(status).send(message);
});

2

Answers


  1. The save method is asynchronous and returns a promise. In your case, newProduct.save() returns a promise which is not being fulfilled and no error is actually thrown:

    app.post('/products', async (req, res, next) => {
        try {
            const newProduct = new Product(req.body);
            await newProduct.save();
            res.redirect(`/products/${newProduct._id}`);
        }
        catch (e) {
            next(e);
        }
    });
    
    Login or Signup to reply.
  2. The best solution would be validate req.body with a validator and save newProduct after it is validated. It’d be better to return the newProduct after it is saved rather than redirecting to certain endpoint.

    If it is not validated you can throw your custom error.

    I recommend using JOI which is very easy to use.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search