动作是触发一系列远程方法并返回被拒绝

问题描述 投票:0回答:1

我有一个正在调度的动作,它正在触发多个远程方法并返回'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的哪一部分正在抛出这两个错误,但是两封电子邮件都会自动发送,并且尽管初始操作创建者返回被拒绝,但商店正在使用所有正确的数据进行更新。我感谢任何人都可以提供帮助。

reactjs redux loopbackjs
1个回答
0
投票

好的,我认为主要问题在于:

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')))

关于Promises的几句话。你可以像这样链接它们:

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
            })
        })
}
© www.soinside.com 2019 - 2024. All rights reserved.