"Cannot POST /" в приложении Vue (Gridsome) - формы Netlify предотвращают перенаправление
Я создаю личный сайт с Gridsome. Я пытаюсь настроить форму подписки на рассылку новостей через Netlify Forms. Я не хочу, чтобы пользователь был перенаправлен после нажатия кнопки "Отправить". Чтобы предотвратить это, я использую@submit.prevent
вот так:
<form name= "add-subscriber" id="myForm" method="post" @submit.prevent="handleFormSubmit"
data-netlify="true" data-netlify-honeypot="bot-field">
<input type="hidden" name="form-name" value="add-subscriber" />
<input type="email" v-model="formData.userEmail" name="user_email" required="" id="id_user_email">
<button type="submit" name="button">Subscribe</button>
</form>
Затем, используя смесь из следующих направляющих ( gridsome руководства, CSS-Tricks руководство) я делаю следующее в моей секции сценария:
<script>
import axios from "axios";
export default {
data() {
return {
formData: {},
}
},
methods: {
encode(data) {
return Object.keys(data)
.map(key => encodeURIComponent(key) + '=' + encodeURIComponent(data[key]))
.join('&')
},
handleFormSubmit(e) {
axios('/', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: this.encode({
'form-name': e.target.getAttribute('name'),
...this.formData,
}),
})
.then(() => this.innerHTML = `<div class="form--success">Almost there! Check your inbox for a confirmation e-mail.</div>`)
.catch(error => alert(error))
}
}
}
</script>
ошибка
Что бы я ни пытался, я не могу понять, как настроить желаемое поведение. Я получаю следующие ошибки ->Error: Request failed with status code 404
& Cannot POST /
Заметка
Причина, по которой я хочу сделать это таким образом, заключается в том, что после того, как пользователь отправит форму, будет вызвана функция Netlify для отправки email_adress в EmailOctopus через их API.
Вот как выглядит функция:
submissions-created.js
import axios from "axios";
exports.handler = async function(event) {
console.log(event.body)
const email = JSON.parse(event.body).payload.userEmail
console.log(`Recieved a submission: ${email}`)
axios({
method: 'POST',
url: `https://emailoctopus.com/api/1.5/lists/contacts`,
data: {
"api_key": apikey,
"email_address": email,
},
})
.then(response => response.json())
.then(data => {
console.log(`Submitted to EmailOctopus:\n ${data}`)
})
.catch(function (error) {
error => ({ statusCode: 422, body: String(error) })
});
}
Простите за длинный вопрос. Я очень ценю ваше время и вашу помощь. Если вам нужна дополнительная информация, дайте мне знать.
1 ответ
Вы можете увидеть функциональную реализацию в моем репо (https://github.com/rasulkireev/gridsome-personal-webite). Это изменения, которые я сделал.
представление-created.js
var axios = require("axios")
exports.handler = async function(event, context) {
const email = JSON.parse(event.body).payload.email
console.log(`Recieved a submission: ${email}`)
return await axios({
method: 'POST',
url: 'https://api.buttondown.email/v1/subscribers',
headers: {
Authorization: `Token ${process.env.BUTTONDOWN_API}`
},
data: {
'email': email,
},
})
.then(response => console.log(response))
.catch(error => console.log(error))
}
Новостная рассылка form
в моих компонентах
<div>
<form
name="add-subscriber"
id="myForm"
method="post"
data-netlify="true"
data-netlify-honeypot="bot-field"
enctype="application/x-www-form-urlencoded"
@submit.prevent="handleFormSubmit">
<input type="hidden" name="form-name" value="add-subscriber" />
<input type="email" name="userEmail" v-model="formData.userEmail">
<button type="submit" name="button">Subscribe</button>
</form>
</div>
со следующим кодом сценария в том же компоненте
import axios from "axios";
export default {
props: ['title', 'description'],
data() {
return {
formData: {
userEmail: null,
},
}
},
methods: {
encode(data) {
const formData = new FormData();
for (const key of Object.keys(data)) {
formData.append(key, data[key]);
}
return formData;
},
handleFormSubmit(e) {
const axiosConfig = {
header: { "Content-Type": "application/x-www-form-urlencoded" }
};
axios.post(
location.href,
this.encode({
'form-name': e.target.getAttribute("name"),
...this.formData,
}),
axiosConfig
)
.then(data => console.log(data))
.catch(error => console.log(error))
.then(document.getElementById("myForm").innerHTML = `
<div>Thank you! I received your submission.</div>
`)
}
}
}