我想我几乎处于与我联系的表格的最后一步,但我似乎无法理解它。我有另一个类似的表单设置,尽管它不处理其中的火基函数。我一直在看几个教程,看看我如何能够修复它,但没有运气。
对于好奇的人来说,这些是我一直在看的:
>
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
虽然我不知道是什么导致了这个错误,但我很确定这个函数有错误。
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给后代组件发值错了? 我编写了前面的演示来测试使用向后代组件发送信息。但它导致了错误: 未捕获的范围错误:对象超过了最大调用堆栈大小。克隆元素 但是我在演示运行良好后才写,所以你能告诉我是什么原因导致错误吗?