действие вызывает серию удаленных методов и возвращает отклоненный - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть отправляемое действие, которое запускает несколько удаленных методов и возвращает 'TALK_SUBMIT_REJECTED' Странно, однако, что все данные, которые я получаю, все еще возвращаются и обновляют хранилище, как и ожидалось.Однако я получаю эти две ошибки в процессе: xhr.js:178 POST http://localhost:3000/api/talks/talkSubmit 500 (Internal Server Error) createError.js:16 Uncaught (in promise) Error: Request failed with status code 500 at e.exports (createError.js:16) at e.exports (settle.js:18) at XMLHttpRequest.m.(:3000/anonymous function) (http://localhost:3000/bundle.js:6:2169)

Я добавил два десятка файла console.logs, записывающего все данные, которые я отправляю и получаю, и все, что возвращается, как и ожидалось.

Я заранее извиняюсь за длинный пост, но некоторое время боролся с этой ошибкой.чтобы кратко описать, что делает мой код: у меня есть форма, которая при отправке запускает действие, которое запускает цепочку удаленных методов.Это первый метод:

    function talkSubmit(speakerInfo, talkInfo, date) {
    return new Promise((resolve, reject) => {
    const { Talk, Speaker, Event } = app.models;
      return Speaker.create(speakerInfo)
         .then(response => {
                let speakerId = response.id
                return getMeetups()
                    .then(meetups => {
                        const index = meetups.findIndex((item) => 
                        item.date == date);
                        let name = meetups[index].name;
                        let details = meetups[index].description;
                        let meetupId = meetups[index].meetupId;
                        if (index === -1)
                            return reject(new Error('NO meetup with that 
                            date found!'));
                        return Event.findOrCreate({ date, name, details, 
                        meetupId })
                            .then(event => {
                                let eventId = event[0].id
                                return Talk.create({ ...talkInfo, 
                                speakerId, eventId })
                                    .then(talk => resolve(talk))
                                    .catch(err => console.log(err))
                            })
                            .catch(err => reject(err))
                    })
                    .catch(err => reject(err))
            })
            .catch(err => reject(err))
    })
    }

    module.exports = { talkSubmit };

//this is the get meetups function that is called by talkSubmit
    function getMeetups() {
    return new Promise((resolve, reject) => {
        let currentDate = new Date();
        currentDate.setMonth(currentDate.getMonth() + 3);
        const date ='${ currentDate.getFullYear() } -${ 
    currentDate.getMonth() } -${
    currentDate.
        getDay()
    } ';
        axios.get(`https://api.meetup.com/sandiegojs/events? 
        no_later_than = ${ date } `)
        return resolve(response.data.map(event => ({
            meetupId: event.id,
            name: event.name,
            date: event.local_date,
            time: event.local_time,
            link: event.link,
            description: event.description,
        })))
        .catch(err => reject(new Error('getMeetups failed to get SDJS 
    meetups')))
    })
    }
    module.exports = { getMeetups };

//This is the after remote method that is triggered when talkSubmit is
//completed.
    Talk.afterRemote('talkSubmit', function (ctx, modelInstance, next) {
        const speakerId = ctx.result.speakerId;
        const eventId = ctx.result.eventId;
        const approved = false;
        const pending = true;
        formatTalkForEmail(speakerId, eventId)
            .then((response) => {
            const speakerName = response.speakerName;
            const speakerEmail = response.speakerEmail;
            const meetupTitle = response.meetupTitle;
            const meetupDate = response.meetupDate;
            sendEmailToSpeaker(process.env.ADMIN_EMAIL, approved, 
            pending, speakerEmail, speakerName, meetupTitle, meetupDate)
            .then(() => next())
                .catch(err => next(err));
        })
        .catch(err => next(err));
        });

//this is the formatTalkForEmail method called in the remote method
function formatTalkForEmail(speakerId, eventId) {
    return new Promise((resolve, reject) => {
        if (speakerId == undefined) {
           return reject(new Error('speakerId is undefined'));
        }

        if (eventId == undefined) {
            return reject(new Error('eventId is undefined'));
        }
        const { Speaker, Event } = app.models;
        Speaker.findById(speakerId)
            .then(speaker => {
                const speakerName = speaker.speakerName;
                const speakerEmail = speaker.speakerEmail
               return Event.findById(eventId)
                    .then(selectedEvent => {
                        const meetupTitle = selectedEvent.name;
                        const meetupDate = selectedEvent.date;
                        resolve({
                            speakerName,
                            speakerEmail,
                            meetupTitle,
                            meetupDate
                        })
                    })
                    .catch(err => reject( err ))
            })
            .catch(err => reject(err))
    })
}
module.exports = { formatTalkForEmail };

        //and finally this is the sendEmailToSpeaker method:


    function sendEmailToSpeaker(adminEmail, approved, pending, 
    speakerEmail, speakerName, meetupTitle, meetupDate) {
    return new Promise((resolve, reject) => {
        let emailContent;
        if (approved && !pending) {
            emailContent = `Congratulations! Your request to speak at
    ${ meetupTitle } on ${ meetupDate } has been approved.`
        }
        if (!approved && !pending) {
            emailContent = `We're sorry your request to speak at 
    ${ meetupTitle } on ${ meetupDate } has been denied.`
        }
        if (pending) {
            emailContent = `Thank you for signing up to speak
    ${ meetupTitle } on ${ meetupDate }.You will be notified as soon as 
    a
    SDJS admin reviews your request.`
            sendEmailToAdmin(adminEmail, meetupDate, meetupTitle, 
    speakerEmail, speakerName)
                .catch(err => console.log(err));
        }
        const email = {
            to: speakerEmail,
            from: adminEmail,
            subject: 'SDJS Meetup Speaker Request',
            templateId: process.env.ADMIN_SPEAKER_EMAIL_TEMPLATE,
            dynamic_template_data: {
                emailContent: emailContent,
                sdjsBtn: false,
                title: 'SDJS Meetup Speaker Request'
            }
        }
        sgMail.send(email)
            .then(() => resolve({ email }))
            .catch(err => {
                console.log(err);
                reject(err);
            });
    })
    }

В заключение я не имею ни малейшего понятия, какая часть talkSubmit выбрасывает эти две ошибки, и все же оба письма автоматически отправляются, и магазин обновляется со всеми необходимыми данными, несмотря напервоначальное действие создателя при возврате отклонено.Я ценю любую помощь, которую может предложить каждый.

1 Ответ

0 голосов
/ 14 апреля 2019

Хорошо, поэтому я думаю, что главная проблема здесь:

axios.get(`https://api.meetup.com/sandiegojs/events?no_later_than = ${ date } `)
        return resolve(response.data.map(event => ({
            meetupId: event.id,
            name: event.name,
            date: event.local_date,
            time: event.local_time,
            link: event.link,
            description: event.description,
        })))

это должно выглядеть так (я рекомендую извлечь метод отображения):

axios.get(`https://api.meetup.com/sandiegojs/events?no_later_than = ${ date} `)
        .then( response => resolve(response.data.map(event => ({
            meetupId: event.id,
            name: event.name,
            date: event.local_date,
            time: event.local_time,
            link: event.link,
            description: event.description,
        }))))
        .catch(err => reject(new Error('getMeetups failed to get SDJS meetups')))

и несколько слов об обещаниях. Вы можете связать их так:

method()
.then(method2())
.then(method3())
.then(method4())
...
.catch(err =>...

также я не понимаю, почему вы заключаете содержимое метода в return new Promise((resolve, reject) => { Я думаю, что это не нужно в вашем случае так что вы можете изменить метод talkSubmit на что-то подобное (это всего лишь черновик, я рекомендую извлекать методы из блоков then)

function talkSubmit(speakerInfo, talkInfo, date) {
    const { Talk, Speaker, Event } = app.models;
    return getMeetups()
        .then(meetups => {
            const index = meetups.findIndex((item) => item.date == date);
            let name = meetups[index].name;
            let details = meetups[index].description;
            let meetupId = meetups[index].meetupId;
            if (index === -1)
                return reject(new Error('NO meetup with that date found!'));
            return Promise.all([
                Event.findOrCreate({
                    date, name, details,
                    meetupId
                }),
                Speaker.create(speakerInfo)])
        })
        .then(([event, speaker]) => {
            let eventId = event[0].id
            let speakerId = speaker.id
            return Talk.create({
                ...talkInfo,
                speakerId, eventId
            })
        })
}
...