vue.js - 将 SendGrid 与 Nuxt.js 一起使用
问题描述
这篇文章实际上不是一个问题。对于那些在 Nuxt.js 和 SendGrid 上苦苦挣扎的人来说,更像是对世界的帮助。我使用 stackoverflow 已经有很长时间了,所以也许现在轮到我开始帮助他人了。
在过去的 8 周里,我一直致力于 Nuxt.js WebApp 开发。Nuxt.js 对我来说是一个巨大的学习曲线和挑战,但我真的很喜欢使用这项技术。
我花了两天时间开发使用 SendGrid 发送表单。网上没有太多帮助,我一直在苦苦挣扎,但我做到了!所以也许有些人会发现我的帖子很有用。
这是我的表格:
<form
v-show="!isSubmitted"
class="contact-us__form"
@submit.prevent="validate">
<b-form-group :class="{'form-group--error': $v.name.$error}">
<b-form-input
id="name"
v-model.trim="$v.name.$model"
type="text"
placeholder="Full Name">
></b-form-input>
<div class="error" v-if="!$v.name.required">Field is required</div>
<div class="error" v-if="!$v.name.minLength">Name must have at least {{$v.name.$params.minLength.min}} letters.</div>
</b-form-group>
<b-form-group :class="{'form-group--error': $v.phone.$error}">
<b-form-input
id="phone"
v-model.trim="$v.phone.$model"
type="number"
placeholder="Phone Number">
></b-form-input>
<div class="error" v-if="!$v.phone.required">Field is required</div>
</b-form-group>
<b-form-group :class="{'form-group--error': $v.email.$error}">
<b-form-input
id="email"
v-model.trim="$v.email.$model"
type="email"
placeholder="Email Address">
></b-form-input>
<div class="error" v-if="!$v.email.required">Field is required</div>
</b-form-group>
<div class="d-flex align-items-end">
<b-form-group :class="{'form-group--error': $v.message.$error}">
<b-form-textarea
id="message"
v-model.trim="$v.message.$model"
type="text"
placeholder="Message"
></b-form-textarea>
<div class="error" v-if="!$v.message.required">Field is required</div>
<div class="error" v-if="!$v.message.minLength">Name must have at least {{$v.message.$params.minLength.min}} characters.</div>
</b-form-group>
<b-form-group>
<b-button
type="submit"
variant="secondary"
v-html="'S'"
:disabled="submitting" />
</b-form-group>
</div>
</form>
脚本:
export default {
mixins: [validationMixin],
components: {
subscribeBox
},
data() {
return {
map: bgMap,
name: "",
phone: "",
email: "",
message: "",
submitting: false,
isSubmitted: false,
error: false,
}
},
validations: {
name: {
required,
minLength: minLength(4)
},
phone: {
required,
},
email: {
required,
email
},
message: {
required,
minLength: minLength(5)
}
},
methods: {
validate() {
if (this.$v.$invalid || this.$v.$error|| this.submitting) {
this.$v.$touch();
return
}
this.onSsubmit();
},
async onSsubmit() {
this.submitting = true;
this.error = false;
try {
await this.$axios.$post('/api/v1/send-email', {
name: this.name,
phone: this.phone,
email: this.email,
message: this.message,
});
this.submitting = false
this.isSubmitted = true
await new Promise(resolve => setTimeout(resolve, 2500))
} catch(e) {
this.submitting = false
this.error = true
console.error(e)
}
},
},
}
nuxt.config.js
serverMiddleware: ['~/api/v1/send-email.js'],
api/v1/send-email.js (所有 API 密钥都放在 .env 文件中)
const express = require("express");
const bodyParser = require('body-parser')
const sgMail = require('@sendgrid/mail');
const app = express();
sgMail.setApiKey(process.env.SENDGRID_API_KEY);
app.use(bodyParser.json())
app.post("/", (req, res) => {
let msg = {
to: req.body.email, // Change to your recipient
from: '', // Change to your verified sender
subject: 'Message from ' + req.body.name,
text: 'telephone ' + req.body.phone + ', ' + 'message ' + req.body.message,
}
sgMail
.send(msg)
.then(() => {
return res.status(200).json({ 'message': 'Email sent!' })
})
.catch((error) => {
return res.status(400).json({ 'error': 'Opsss... Something went wrong ' + error })
})
});
module.exports = {
path: "/api/v1/send-email",
handler: app
};
这个应用程序还没有完成,但代码工作 100%!我是 Nuxt.js 的新手,所以有些内容可能看起来不太好,但我也很高兴并乐于接受反馈和建议。
感谢您阅读我的帖子,祝您项目顺利!:)
解决方案
推荐阅读
- clojure - 如何动态定义规格?
- java - 从另一个查询中检索值后如何在查询中插入值
- flutter - 带有 Bloc 的 ImagePicker - Flutter
- asp.net - 如何告诉 services.AddAuthorization 我的自定义用户和角色表在哪里
- javascript - 调试器在 Firefox 中显示“布局强制”问题
- c++ - 跨多个线程和 cpu 安全地修改和读取布尔值的选项有哪些?
- php - 在 php 中使用特定时间戳将 -1 天添加到 DBDatetime
- javascript - HIghcharts使用vue composition api重绘packedbubble
- powerapps - 使用来自 Web API 调用的 JSON 创建一个新的 ComponentFramework.PropertyTypes.Dataset
- python - 当应用程序失败时,Docker 容器中的 Python 应用程序不会停止/删除 Docker 容器