как обрабатывать обещание от dto до объекта с обещанием поля?

#javascript #nestjs #typeorm

#javascript #nestjs #typeorm

Вопрос:

У меня возникла проблема при сопоставлении Dto с объектом, где есть столбец с обещаниями, когда я сопоставил dto с объектом, в json есть __entity __ … Я хочу избавиться от этого

Я попытался сопоставить 1 на 1, но это не имеет значения, если столбцов так много, я успешно попробовал Object.assign, но когда в Return json все еще остается объект

вот несколько фрагментов кода

Объект класса

 experiences: Promise<Experience[]>;
portfolios: Promise<Portfolio[]>;
 

DTO

 experiences?: ExperiencePayload[];
portfolios?: PortfolioPayload[];
 

Функция,

 public async getResumeByTalent(id: string): Promise<ResumePayload> {
    const resume: Resume = await this.resumeRepository.findOne({ relations: ['experiences', 'addresses', 'languages', 'educations', 'portfolios'], where: {talentId: id}});
    if (!resume) throw new BadRequestException(`Resume with Talent Id ${id} not found`);
    const {languages, educations, experiences, addresses, portfolios} =  resume;
    const resumePayload: ResumePayload = new ResumePayload();

    resumePayload.citizen = resume.citizen;
    resumePayload.citizenCard = resume.citizenCard;
    resumePayload.currentSalary = resume.currentSalary;
    resumePayload.expectedSalary = resume.expectedSalary;
    resumePayload.facebookProfile = resume.facebookProfile;
    resumePayload.githubProfile = resume.githubProfile;
    resumePayload.hobbies = resume.hobbies;
    resumePayload.job = resume.job;
    resumePayload.objective = resume.objective;
    resumePayload.skill = resume.skill;
    resumePayload.languages = await languages;
    resumePayload.educations = await educations;
    resumePayload.experiences = await experiences;
    resumePayload.addresses = await addresses;
    resumePayload.portfolios = await portfolios;
    return resumePayload;
  }
 

Я попробовал приведенный выше фрагмент кода, он сработал, но слишком много отображено, и я пытаюсь

 Object.assign(resumePayload, resume);
 

но возврат в json

 {
        "id": "asasasa",
        "talentId": "a6cb25db-21be-4303-b63e-c3dcbcd7b2a2",
        "citizen": "99999292",
        "citizenCard": "KTP",
        "skill": null,
        "expectedSalary": 100000,
        "currentSalary": 100000,
        "objective": "JASJASJAJS",
        "hobbies": "JJJJJ",
        "linkedinProfile": null,
        "githubProfile": null,
        "facebookProfile": null,
        "job": null,
        "createdAt": "2021-01-14T17:10:09.628Z",
        "createdBy": "system",
        "updatedAt": "2021-01-14T17:10:09.628Z",
        "updatedBy": null,
        "deletedAt": null,
        "deletedBy": null,
        "__experiences__": [],
        "__addresses__": [],
        "__languages__": [],
        "__educations__": [],
        "__portfolios__": []
 }
 

я не хочу удалять ___education__ , не сопоставляя со многими

С уважением

Ответ №1:

Я уверен, что для этого уже существуют библиотеки, но я думаю, что простая функция Typescript может выглядеть следующим образом:

 async function recursiveAwait(obj: any): Promise<any> {
    if (Array.isArray(obj)) {
        return (await Promise.all(obj.map(o => recursiveAwait(o))));
    }
    if (typeof obj === 'object') {
        for (const key in obj) {
            obj[key] = await recursiveAwait(obj[key]);
        }
        return obj;
    }
    return await obj;
}
 

Это неэффективно, но для этого не нужны какие-либо внешние библиотеки, которые могут быть полезны, если вам не нужны зависимости.

И обратите внимание, что это действительно неэффективно, оно не пытается разрешить все обещания параллельно и ожидает переменные, которые не являются обещаниями, что не идеально.

Вы также теряете ввод текста, что можно решить с помощью шаблонов:

 sync function recursiveAwait<T, U>(obj: T): Promise<U>;
 

Но тогда вам нужно определить объект U , который является только разрешенной версией T .


Пример использования этой функции будет выглядеть следующим образом:

 async function run() {
    let myPromises = {
        arrayOfThem: [
            new Promise(resolve => setTimeout(() => resolve(1), 1000)),
            new Promise(resolve => setTimeout(() => resolve(2), 2000)),
        ],
        oneOfThem: new Promise(resolve => setTimeout(() => resolve(3), 1500)),
        objectOfThem: {
            a: new Promise(resolve => setTimeout(() => resolve(4), 1000)),
            b: new Promise(resolve => setTimeout(() => resolve(5), 2000)),
        },
        somethingElse: {
            a: 'a',
            b: ['b', 'c']
        },
        str: 'string'
    }
    console.log(myPromises);
    myPromises = await recursiveAwait(myPromises);
    console.log(myPromises);
}

run().then(() => console.log('done'));