javascript - 为什么我的构造函数状态属性没有发送到 server.js?
问题描述
我正在尝试在使用 react/node.js 提交联系表单后发送电子邮件 - 我的构造函数变量没有被正确设置(我认为)并且每当我提交表单时在我的 server.js 中都是“未定义”。
提交表单后,我的所有变量(contactName、contactEmail、contactSubject、contactMessage)都应发送到 server.js,但 server.js 中的 req.body 对象未定义,并且没有这些变量的值。
如果有人有建议或知道不同的方法来做到这一点,请随时发表评论
免责声明:我是一个完整的 js 菜鸟,我有 #C/.NET 和 python 背景。请原谅我,因为我知道这是一个简单的解决方法。
日志
undefined
TypeError: Cannot read property 'contactName' of undefined
at Z:\web-development\react\react-resume\server.js:101:25
联系.js
import React, { Component } from "react";
import { Fade, Slide } from "react-reveal";
import axios from "axios";
class Contact extends Component {
constructor(props) {
super(props);
this.state = {
contactName: '',
contactEmail: '',
contactSubject: '',
contactMessage: ''
}
}
onNameChange(event) {
this.setState({contactName: event.target.value})
}
onEmailChange(event) {
this.setState({contactEmail: event.target.value})
}
onSubjectChange(event) {
this.setState({contactSubject: event.target.value})
}
onMsgChange(event) {
this.setState({contactMessage: event.target.value})
}
render() {
if (!this.props.data) return null;
const name = this.props.data.name;
const street = this.props.data.address.street;
const city = this.props.data.address.city;
const st = this.props.data.address.state;
const zip = this.props.data.address.zip;
const phone = this.props.data.phone;
const message = this.props.data.message;
return (
<section id="contact">
<Fade bottom duration={1000}>
<div className="row section-head">
<div className="two columns header-col">
<h1>
<span>Get In Touch.</span>
</h1>
</div>
<div className="ten columns">
<p className="lead">{message}</p>
</div>
</div>
</Fade>
<div className="row">
<Slide left duration={1000}>
<div className="eight columns">
<form id="contactForm" onSubmit={this.submitEmail.bind(this)} method="POST">
<fieldset>
<div>
<label htmlFor="contactName">
Name <span className="required">*</span>
</label>
<input
type="text"
defaultValue=""
size="35"
id="contactName"
name="contactName"
required value={this.state.contactName}
onChange={this.onNameChange.bind(this)}
/>
</div>
<div>
<label htmlFor="contactEmail">
Email <span className="required">*</span>
</label>
<input
type="text"
defaultValue=""
size="35"
id="contactEmail"
name="contactEmail"
required value={this.state.contactEmail}
onChange={this.onEmailChange.bind(this)}
/>
</div>
<div>
<label htmlFor="contactSubject">Subject</label>
<input
type="text"
defaultValue=""
size="35"
id="contactSubject"
name="contactSubject"
required value={this.state.contactSubject}
onChange={this.onSubjectChange.bind(this)}
/>
</div>
<div>
<label htmlFor="contactMessage">
Message <span className="required">*</span>
</label>
<textarea
cols="50"
rows="15"
id="contactMessage"
name="contactMessage"
required value={this.state.contactMessage}
onChange={this.onMsgChange.bind(this)}
></textarea>
</div>
<div>
<button type='submit'>Submit</button>
</div>
</fieldset>
</form>
</div>
</Slide>
<Slide right duration={1000}>
<aside className="four columns footer-widgets">
<div className="widget widget_contact">
<h4>Address and Phone</h4>
<p className="address">
{name}
<br />
{street} <br />
{city}, {st} {zip}
<br />
<span>{phone}</span>
</p>
</div>
</aside>
</Slide>
</div>
</section>
);
}
submitEmail(e){
e.preventDefault();
axios({
method: "POST",
url:"/send",
data: this.state
}).then((response)=>{
if (response.data.status === 'success'){
alert("Message Sent.");
// this.resetForm()
}else if(response.data.status === 'fail'){
alert("Message failed to send.")
}
})
};
resetForm() {
this.setState({contactName: '', contactEmail: '',contactSubject:'', contactMessage: ''})
};
}
export default Contact;
服务器.js
const express = require('express');
const nodemailer = require('nodemailer');
const cors = require('cors');
const app = express();
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Listening on port ${PORT}...`);
});
const transporter = nodemailer.createTransport({
host: "smtp.gmail.com",
port: 587,
auth: {
user: 'adam2.siwiec@gmail.com',
pass: 'password#!',
},
});
transporter.verify(function(error, success) {
if (error) {
console.log(error);
} else {
console.log("Server is ready to take our messages");
}
});
app.post('/send', (req, res, next) => {
var name = req.body.contactName
var email = req.body.contactEmail
var subject = req.body.contactSubject
var message = req.body.contactMessage
var mail = {
from: name,
to: 'adam2.siwiec@gmail.com',
subject: subject,
text: message
}
transporter.sendMail(mail, (err, data) => {
if (err) {
res.json({
status: 'fail'
})
} else {
res.json({
status: 'success'
})
}
})
});
解决方案
推荐阅读
- swift - [Swift]如何使用 ReadLine 初始化一个期望 String 的类?
- vue.js - 如何在 vuetify v-calendar 中向事件添加信息?
- regex - 如何从日志文件中提取所需内容?
- node.js - 如何使用 React 和 Express 正确配置 Firebase 托管
- android - Flutter - 将应用分发到Google Play控制台时出现问题但在app bundle测试,模拟器测试中没有问题
- windows - Firebase 函数部署了多个无法在 Windows 上运行的函数
- cryptography - 在 freepascal 中 secp256k1 密钥生成和签名/验证的工作示例
- javascript - 对 JSON 文件元素进行排序?
- c# - 为什么在 unload 事件触发后 AppDomain 仍然引用动态加载的程序集?
- python - Python 中的逆矩阵 np.linalg.inv 给出了奇怪的结果,为什么?