Nodejs express how to return response from service

Viewed 33

I am trying to create a controller and service for registration api. What I need to try is to return response to my controller and then show to api.

registerservice.js

const { User } = require('../models/user');

async function register(params) {
    let user = new User({
        name: params.name,
        email: params.email,
        passwordHash: params.password,
        phone: params.phone,
        isAdmin: params.isAdmin,
        street: params.street,
        apartment: params.apartment,
        zip: params.zip,
        city: params.city,
        country: params.country,
    })


    try {
        checkUser = await User.findOne({ email: params.email }).exec()
        if (checkUser) {
            return res.status(400).send('Duplicate Email')
        }
        else user = await user.save()

        if (!user)
            return res.status(400).send('the user cannot be created!')
            
            return res.send(user);

    } catch (error) {
        console.log(error)
    }

}

module.exports = {
    register
};

controller.js

router.post("/register",
    async (req, res) => {
        registerServices.register(req.body).then(
            // res.json({success:true})
        ).catch(err => next(err))
        
    });

I am not getting how can I return response from service to controller with status like if email duplicate status will be 400 with message something like this.

1 Answers

Your registration service can return status codes and messages as an object that you await in the request handler and then send to the user:

registerservice.js

const { User } = require('../models/user');

async function register(params) {
    let user = new User({
        name: params.name,
        email: params.email,
        passwordHash: params.password,
        phone: params.phone,
        isAdmin: params.isAdmin,
        street: params.street,
        apartment: params.apartment,
        zip: params.zip,
        city: params.city,
        country: params.country,
    })


    try {
        checkUser = await User.findOne({ email: params.email }).exec()
        if (checkUser) {
            return { code: 400, message: 'duplicate email' }
        }
        else user = await user.save()

        if (!user) return { code: 400, message: 'the user can not be created' }
            
        return { code: 200, user };

    } catch (error) {
        console.log(error)
        return { code: 500, message: 'error' }
    }
}

module.exports = {
    register
};

And controller.js

router.post('/register', async (req, res) => {
    let result = await registerServices.register(req.body)
    if(result.code != 200) return res.status(result.code).json({
        message: result.message,
        success: false
    })

    return res.status(200).json({ user: result.user, success: true })
})
Related