AutoMapper icon indicating copy to clipboard operation
AutoMapper copied to clipboard

mapper not working when adding extra logic in forMember()

Open urko-b opened this issue 5 years ago • 0 comments

Hi @loedeman I have some trouble using automapper on node js project. When I add extra logic on mapper it's not working, It is also not stopping on breakpoints. I'll attach a video:

My mapper:


const functions = require('../../common/functions');
const automapper = require('automapper-ts');
const _ = require('lodash');


module.exports.newCompetenceMapFromKey = 'newCompetenceClientObject';
module.exports.newCompetenceMapToKey = 'newCompetenceMongoObject';

const languages = ['es', 'en'];

module.exports.initCompetenceMapper = () => {
    languages.forEach(language => {
        createMap({ language });
    });
};

const createMap = ({ language = 'es' }) => {
    automapper.createMap(`${this.newCompetenceMapFromKey}_${language}`, `${this.newCompetenceMapToKey}_${language}`)
        .forMember('name', function (opts) { opts.ignore(); })
        .forMember(`name.${language}`, function (opts) {
            if (!functions.isEmpty(opts.intermediatePropertyValue)) {
                return opts.mapFrom('name');
            } else if (_.has(opts.sourceObject, `name.${language}`)) {
                return opts.mapFrom(`name.${language}`);
            } else {
                return opts.ignore();
            }
        })
        .forMember('description', function (opts) { opts.ignore(); })
        .forMember(`description.${language}`, function (opts) {
            if (!functions.isEmpty(opts.intermediatePropertyValue)) {
                return opts.mapFrom('description');
            } else if (_.has(opts.sourceObject, `description.${language}`)) {
                return opts.mapFrom(`description.${language}`);
            } else {
                return opts.ignore();
            }
        })
        .forMember('nivel', function (opts) { opts.ignore(); })
        .forMember(`nivel.${language}`, function (opts) {
            if (!functions.isEmpty(opts.intermediatePropertyValue)) {
                return opts.mapFrom('nivel');
            } else if (_.has(opts.sourceObject, `nivel.${language}`)) {
                return opts.mapFrom(`nivel.${language}`);
            } else {
                return opts.ignore();
            }
        })
        ;


};

module.exports.mapNewCompetence = ({ objectToMap, language }) => automapper.map(`${this.newCompetenceMapFromKey}_${language}`, `${this.newCompetenceMapToKey}_${language}`, objectToMap);
//module.exports.mapUpdateEmployee = ({ objectToMap, language }) => automapper.map(this.updateEmployeeMapFromKey, this.updateEmployeMapToKey, objectToMap);

The code where I am using the mapper

module.exports.updateOne = async ({ id, competence, language = process.env.LANG_DEFAULT }) => {
    if (!_.has(competence, `name.${language}`)) competence = competencesMapper.mapNewCompetence({ objectToMap: { ...competence }, language });
    const updatedCompetence = await Competences.findOneAndUpdate(functions.getFindById(id), competence, { new: true });
    return await this.findById({ id: updatedCompetence._id });
};

image

As you can see in this picture, after mapping the result is an empty object. Is quite strange because if I remove "elseIf" condition I'm able to debug, otherwise I'm not.

stop_on_breakpoints dont_stop_on_breakpoints

Of course I've called the init function in app.js:

exports.server = app.listen(process.env.PORT, () => {
    initMappers();
});

const initMappers = () => {
    employeeMapper.initEmployeeMapper();
    personalDataMapper.initPersonalDataMapper();
    cardPositionMapper.initCardPositionMapper();
    competenceMapper.initCompetenceMapper();
    positionMapper.initPositionMapper();
}

urko-b avatar Jan 21 '20 11:01 urko-b