Страница представляет собой небольшой опрос (12 вопросов), выполненный с помощью Angular 2+, и окончательную форму с именем - ввод электронной почты, кнопка проверки и кнопка для отправки результатов. Кнопка вызывает функцию Parse.cloud.run, которая создает PDF и возвращает его в base64, затем мы сохраняем данные и отправляем электронное письмо с другой функцией parse.cloud. Ну, эта страница отлично работает в Chrome и Firefox. В Microsoft Edge это никогда не работает. В Safari работает практически каждый раз (только в одном imac у нас та же проблема, что и в Edge).
Проблема в том, что при вызове этой функции Parse.cloud браузер пытается перенаправить вас на URL-адрес с входными данными в качестве параметров (пример: url+inputNameN=dsfdsf&inputEmailN=pepe@pepe.es&inputCheckN=on) и завершается. в ошибке 404 Not Found (очевидно, страница не существует).
После нескольких исследований я ничего не нашел в этом отношении. Я не понимаю это поведение и причины его возникновения.
Это сокращенный код, когда он попадает в строку "Parse.Cloud.run ('create-pdf', formData)", когда происходит ошибка.
onSend(): void {
if (!this.inputName || this.inputName.length==0) {
//code
}
if (!this.inputEmail || this.inputEmail.length==0) {
//code
}
if (!this.inputCheck) {
//code
}
var email = this.inputEmail.toLowerCase();
var emailRegEx1 = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i;
var emailRegEx2 = /^.+@.+\.[a-z]{2,4}$/i;
var validEmail=emailRegEx1.test(email) && emailRegEx2.test(email);
if (!validEmail) {
//code
}
var formData = {
"text1" : this.temporalTitle,
"text2" : this.temporalBody,
"text3" : this.interlude,
"firstAnswer" : this.firstAnswer,
"secondAnswer" : this.secondAnswer,
"thirdAnswer" : this.thirdAnswer,
"fourthAnswer" : this.fourthAnswer,
"fifthAnswer" : this.fifthAnswer,
"sixthAnswer" : this.sixthAnswer,
"seventhAnswer" : this.seventhAnswer,
"eigthAnswer" : this.eigthAnswer,
"ninthAnswer" : this.ninthAnswer,
"tenthAnswer" : this.tenthAnswer,
"higth": this.resultado,
"left": this.leftResult,
"rigth": this.rightResult,
"on": 1
}
Parse.Cloud.run('create-pdf', formData)
.then((data)=> {
if (!data.error) {
var base64data = {
base64: data.message.base64
};
var d = new Date();
var name = "_resultado_cuestionario" + d.getTime() + ".pdf";
var parseFile = new Parse.File(name, base64data);
parseFile.save().then((p)=> {
let result = Parse.Object.extend("Results");
let myResult = new result();
myResult.set("answer1",this.answer1);
myResult.set("answer2",this.answer2);
myResult.set("answer3",this.answer3);
myResult.set("answer4",this.answer4);
myResult.set("answer5",this.answer5);
myResult.set("answer6",this.answer6);
myResult.set("answer7",this.answer7);
myResult.set("answer8",this.answer8);
myResult.set("answer9",this.answer9);
myResult.set("answer10",this.answer10);
myResult.set("answer11",this.answer11);
myResult.set("answer12",this.answer12);
myResult.set("sum",this.resultado);
myResult.set("email",this.inputEmail);
myResult.set("name",this.inputName);
myResult.set("pdf",parseFile);
myResult.save()
.then((ok)=>{
var formData = {
"mail": this.inputEmail,
"subject": "Envío de informe RMG (en pruebas)",
"message": this.informe,
"urlFile": ok.attributes.pdf._url
}
Parse.Cloud.run('send-mail', formData)
.then((data)=> {
if (data.success) {
//code
}
else {
//code
}
});
})
.catch((error)=>{
console.log(error);
})
}, function(error) {
console.log('error en la imagen 2' + error)
});
}
else {
//swal("Error!!", data.message, "error");
}
});
}
Это HTML-часть:
<div class="container">
<div class="row">
<div class="col">
<h4>Para recibir su informacion gratuita rellene los siguientes campos:</h4>
<br>
<form #mailForm="ngForm">
<div class="form-group">
<label for="exampleInputName1">Nombre Empresa</label>
<input type="text" class="form-control" id="exampleInputName1" [(ngModel)]="inputName" name="inputNameN" placeholder="nombre empresa">
</div>
<div class="form-group">
<label for="exampleInputEmail1">Mail</label>
<input type="email" class="form-control" id="exampleInputEmail1" [(ngModel)]="inputEmail" name="inputEmailN" aria-describedby="emailHelp" placeholder="mail">
<small id="emailHelp" class="form-text text-muted">Nunca compartiremos su mail con nadie.</small>
</div>
<div class="form-group form-check">
<input type="checkbox" class="form-check-input" id="exampleCheck1" [(ngModel)]="inputCheck" name="inputCheckN">
<label class="form-check-label" for="exampleCheck1">Check me out</label>
</div>
<button type="submit" class="btn btn-primary" (click)="onSend()" ng-disabled="sending">Enviar</button>
</form>
</div>
</div>
</div>
Это функция parse.cloud в бэкэнде
Parse.Cloud.define('create-pdf', function (req, res) {
let object = pdfConf.validate(req.params.text1, req.params.text2,req.params.text3,
req.params.firstAnswer,req.params.secondAnswer,req.params.thirdAnswer,req.params.fourthAnswer,req.params.fifthAnswer,
req.params.sixthAnswer,req.params.seventhAnswer,req.params.eigthAnswer,req.params.ninthAnswer,req.params.tenthAnswer,
req.params.higth, req.params.left, req.params.rigth, req.params.on);
if (object.error) {
res.error( { error: object.error, message: object.message } );
return;
}
let pdf = pdfConf.createPdf(object)
.then((success) => {
res.success( success );
})
.catch((e) => {
res.error( e );
});
});
Если хотите, вы можете попробовать эту страницу здесь: https://rmg.aratech.org. Как я уже сказал, это опрос с 12 вопросами и окончательной формой, выберите любые ответы и поставьте фальшивое имя и фальшивые письма в конце.
Любая помощь будет оценена.