当前位置: 首页 > 知识库问答 >
问题:

带有nodemailer和Firebase函数的reactjs联系表单-RangeError:超出最大调用堆栈大小

端木夕
2023-03-14

我想我几乎处于与我联系的表格的最后一步,但我似乎无法理解它。我有另一个类似的表单设置,尽管它不处理其中的火基函数。我一直在看几个教程,看看我如何能够修复它,但没有运气。

对于好奇的人来说,这些是我一直在看的:

>

  • https://pantaley.com/blog/How-to-integrate-Serverless-contact-form-using-Firebase-Cloud-functions-in-React/

    https://better programming . pub/a-简单易用的联系方式-逐步指南-react-js-1532bc025980

    https://academind.com/tutorials/sending-an-email-with-react-and-cloud-functions/

    我已经在我的firebase函数索引中设置了代码.js并且我已经用postman对其进行了测试,并且它成功了。所以我知道索引.js代码有效。

    但是,当我尝试创建“联系我们”页面,并在下面贴上标记为“原始代码”的代码,然后单击我创建的“发送”按钮时,什么也没有发生,当我检查时,我在控制台中看到此错误。

    RangeError: Maximum call stack size exceeded
        at FiberNode.hasOwnProperty (<anonymous>)
        at mapValues (serializer.ts:29)
        at Serializer.encode (serializer.ts:61)
        at serializer.ts:61
        at mapValues (serializer.ts:30)
        at Serializer.encode (serializer.ts:61)
        at serializer.ts:61
    <error repeats>
    

    这是我的联系方式代码。当我走过时,它挂在这里

    sendEmail({
       name: nameRef,
       email: emailRef,
       message: messageRef
    })
    

    原始代码< code>contactUs.js

    import React, {useRef, useState} from "react";
    import {useAuth} from "../contexts/AuthContext";
    import {useHistory} from "react-router-dom";
    import firebase from 'firebase/app';
    import classes from "./xclasses.module.scss";
    import {Button, Container, Form} from "react-bootstrap";
    
    const sendEmail = firebase.functions().httpsCallable('sendEmail');
    
    export default function ContactUs() {
        const nameRef = useRef();
        const emailRef = useRef();
        const messageRef = useRef();
        const firmRef = useRef();
        const history = useHistory();
    
        const [error, setError] = useState("")
        const [loading, setLoading] = useState(false)
    
    

    我所尝试的:

    我尝试将sendEmail调用单独移动到handleSubmit之外,因为这个SO Post说不要在render调用内部调用setState,因为它执行无限循环。

    由于历史记录.push(“/ContactUs”)呼叫,单击提交按钮后,表单会清除,但电子邮件未发送,并且我无法在我的firebase函数仪表板上看到任何已调用的sendMail。

    试试B码

        const submitForm = async () => {
            await sendEmail({
                name: nameRef,
                email: emailRef,
                message: messageRef
            }).then(result => {
                console.log("contact-us message sent with " + result.data.message)        
            })
                .catch(error => {
                    console.log(error);               
                });
        }*/
    

    原始代码

        async function handleSubmit(e) {
            e.preventDefault()
    
            setError("")
            setLoading(true)
    
           sendEmail({
                name: nameRef,
                email: emailRef,
                message: messageRef
            }).then(result => {
                console.log("contact-us message sent with " + result.data.message)            
            })
                .catch(error => {
                    console.log(error);                
                });
    
            history.push("/ContactUs")
            setLoading(false)
        }
    
        return (
            <React.Fragment>
                <div className={classes.body}>
                    <Container>
                        <div className={classes.body}>
                            <h2>Contact Us</h2>
                            {/*<Form onSubmit={submitForm}>*/} // also tried this (Try B Code)
                            <Form onSubmit={handleSubmit}>
                                <Form.Group id="email">
                                    <Form.Label>Email</Form.Label>
                                    <Form.Control type="email" ref={emailRef} required/>
                                </Form.Group>
                                <Form.Group id="name">
                                    <Form.Label>Name</Form.Label>
                                    <Form.Control type="text" ref={nameRef} required/>
                                </Form.Group>
                                <Form.Group id="message">
                                    <Form.Label>Message</Form.Label>
                                    <Form.Control type="text" ref={messageRef} required/>
                                </Form.Group>
    
                                <Form.Group id="firm">
                                    <Form.Label>Firm</Form.Label>
                                    <Form.Control type="text" ref={firmRef} required/>
                                </Form.Group>
    
                                {/*<Button onClick={submitForm} className="w-100" type="submit">*/}
                                // also tried this ^^ (Try B Code)
                                <Button disabled={loading} className="w-100" type="submit">
                                    Send
                                </Button>
                            </Form>
                        </div>
                    </Container>
                </div>
            </React.Fragment>
        )
    }
    

    任何和所有的帮助都是值得赞赏的。

    @somoneSpecial comments于2021 5月16日更新

    更新代码:

    import React, {useRef, useState} from "react";
    import {useAuth} from "../contexts/AuthContext";
    import {useHistory} from "react-router-dom";
    import firebase from 'firebase/app';
    import classes from "./SyncManagerDemo.module.scss";
    import {Button, Container, Form} from "react-bootstrap";
    
    
    export default function ContactUs() {
        const nameRef = useRef();
        const emailRef = useRef();
        const messageRef = useRef();
        const firmRef = useRef();
        const history = useHistory();
    
        const [error, setError] = useState("")
        const [loading, setLoading] = useState(false)
    
    
        async function handleSubmit(e) {
            e.preventDefault()
    
            const sendEmail = firebase.functions().httpsCallable('sendEmail');
            console.log("nameRef: " + nameRef.current.value);
            console.log("emailRef: " + emailRef.current.value);
            console.log("messageRef: " + messageRef.current.value);
    
            const test = await sendEmail({
                name: nameRef.current.value,
                email: emailRef.current.value,
                message: messageRef.current.value
            }).then(function (result) {
                var messageSent = result.data.message;
                console.log(nameRef.current + " " + emailRef.current + " " + messageRef.current + " " + messageSent)
            });        
        }
    return (
            <React.Fragment>
                <div className={classes.body}>
                    <Container>
                        <div className={classes.body}>
                            <h2>Contact Us</h2>
                            {/*todo: convert to Bootstrap inputs: https://getbootstrap.com/docs/4.0/components/forms/ */}
                            {/*<Form onSubmit={submitForm}>*/}
                            {/*<Form onSubmit={sendEmail}>*/}
                            {/*<Form onSubmit={sendEmail2}>*/}
                            <Form onSubmit={handleSubmit}>
                                <Form.Group id="email">
                                    <Form.Label>Email</Form.Label>
                                    <Form.Control type="email" ref={emailRef} required/>
                                </Form.Group>
                                <Form.Group id="name">
                                    <Form.Label>Name</Form.Label>
                                    <Form.Control type="text" ref={nameRef} required/>
                                </Form.Group>
                                <Form.Group id="message">
                                    <Form.Label>Message</Form.Label>
                                    <Form.Control type="text" ref={messageRef} required/>
                                </Form.Group>
    
                                <Form.Group id="firm">
                                    <Form.Label>Firm</Form.Label>
                                    <Form.Control type="text" ref={firmRef} required/>
                                </Form.Group>
    
                                {/*<Button onClick={submitForm} className="w-100" type="submit">*/}
                                <Button disabled={loading} className="w-100" type="submit">
                                    Send
                                </Button>
                            </Form>
                        </div>
                    </Container>
                </div>
            </React.Fragment>
        )
    }
    
    

    我现在得到的错误:

    Uncaught (in promise) Error: internal
    HttpsErrorImpl                          error.ts:65
    _errorForResponse                       error.ts:175
    (anonymous function)                    service.ts:276
    step                                    tslib.es6.js:100
    (anonymous function)                    tslib.es6.js:81
    fulfilled                               tslib.es6.js:71
    Async call from async function
    handleSubmit                            ContactUs.js:47
    callCallback                            react-dom.development.js:3945
    invokeGuardedCallbackDev                react-dom.development.js:3994
    invokeGuardedCallback                   react-dom.development.js:4056
    invokeGuardedCallbackAndCatchFirstError react-dom.development.js:4070
    executeDispatch                         react-dom.development.js:8243
    processDispatchQueueItemsInOrder        react-dom.development.js:8275
    processDispatchQueue                    react-dom.development.js:8288
    dispatchEventsForPlugins                react-dom.development.js:8299
    (anonymous function)                    react-dom.development.js:8508
    batchedEventUpdates$1                   react-dom.development.js:22396
    batchedEventUpdates                     react-dom.development.js:3745
    dispatchEventForPluginEventSystem       react-dom.development.js:8507
    attemptToDispatchEvent                  react-dom.development.js:6005
    dispatchEvent                           react-dom.development.js:5924
    unstable_runWithPriority                scheduler.development.js:646
    runWithPriority$1                       react-dom.development.js:11276
    discreteUpdates$1                       react-dom.development.js:22413
    discreteUpdates                         react-dom.development.js:3756
    dispatchDiscreteEvent                   react-dom.development.js:5889
    
  • 共有1个答案

    颛孙昆
    2023-03-14

    虽然我不知道是什么导致了这个错误,但我很确定这个函数有错误。

    sendEmail({
            name: nameRef.current.value,
            email: emailRef.current.value,
            message: messageRef.current.value
        }).then(result => {
            console.log("contact-us message sent with " + result.data.message)            
        })
            .catch(error => {
                console.log(error);                
            });
    
        history.push("/ContactUs") //<=== this is being called before sendMail is completed.
        setLoading(false)
    

    您可能应该尝试使用此代码。

       try {
         const results = await sendEmail({
                name: nameRef.current.value,
                email: emailRef.current.value,
                message: messageRef.current.value
            })
        console.log("contact-us message sent with " + result.data.message)  
        setLoading(false)
        history.push("/ContactUs") //<-- now this will be called properly.
        } catch (err) {
           console.log('error', error)
        }
    

    另一个问题是你的ref,你必须使用ref.current,而不仅仅是ref。参见< code >发送电子邮件

    因为您正在使用firebase.functions()。httpsCallable,确保您。onCall()而不是onRequest()。

     类似资料:
    • 问题内容: 我想这意味着有一个循环引用,但是对于我的一生,我无法猜测如何解决它。 有人有主意吗? http://plnkr.co/edit/aNcBcU?p=预览 检查Chrome中的调试控制台(例如),您将看到错误。冒犯的行是 通过以下方式在控制器上对scope.map进行“ $ watched” 问题答案: 这是因为您要比较对象是否相等,而不是参考。将您的声明更改为此:

    • 这是我在React中的第一个应用程序。在localhost中,一切正常,当我使用Github Pages部署时,我的应用程序(Info/Images/evenements)中的一些页面无法呈现。每次单击他们的链接访问他们时,我都会在控制台上看到一个白色页面和此错误: range error:object . tostring处超出了最大调用堆栈大小 同样,当我刷新页面时,github pages返

    • 我将redux添加到我的项目中进行状态管理,在添加reducer之前一切都很好 我认为每个中间件功能的下一步(操作)都会导致问题,但我不知道如何修复它。 我使用的是React 17.0.2,React redux 7.2.3,redux 4.1.2。 动作-- 中间件-- 中间件-- 减速机 -- 商店.js:

    • 问题内容: 我试图将文档批量插入MongoDB中(因此绕过Mongoose并使用本机驱动程序,因为Mongoose不支持批量插入文档数组)。我这样做的原因是为了提高写作速度。 我在以下代码中的console.log(err)处收到错误“ RangeError:超出最大调用堆栈大小”: 也许与Mongoose返回的响应数组的格式有关,这意味着我不能直接使用MongoDB进行本机插入吗?我已经在每个响

    • 当我为图表(react-chartjs-2)获取数据时,我收到了这个错误。我实现了try/catch块,但不知道如何删除这个错误。在Edge浏览器上,我得到了CRIPT28:SCRIPT28:堆栈空间不足 这是我在组件中调用的操作。 这是连接到redux存储的组件。它在我看来一切都很好。

    • React.js用props给后代组件发值错了? 我编写了前面的演示来测试使用向后代组件发送信息。但它导致了错误: 未捕获的范围错误:对象超过了最大调用堆栈大小。克隆元素 但是我在演示运行良好后才写,所以你能告诉我是什么原因导致错误吗?