AutoMapper
AutoMapper copied to clipboard
mapper not working when adding extra logic in forMember()
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 });
};
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.
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();
}