如何在 Angular 中通过 HTTP 触发 Google 云函数?
How do I HTTP Trigger a Google Cloud Function in Angular?
我正在尝试通过 Google Cloud Functions 设置 REST API 来发送电子邮件,供我的 Angular 应用程序使用,该应用程序由 Firebase 托管。我的问题是我无法获取我的 Angular 代码来触发我的 google 云功能。谁能解释一下出了什么问题?
服务器端Google云函数代码
我在 functions/index.js
中有这个 Google 云功能:
// index.js
const functions = require('firebase-functions');
const sg = require('sendgrid')(
process.env.SENDGRID_API_KEY || '<my-api-key-placed-here>'
);
exports.sendmail = functions.https.onRequest((req, res) => {
sendMail(req.body);
res.send("Mail Successfully Sent!");
})
function sendMail(formData) {
const mailRequest = sg.emptyRequest({
method: 'POST',
path: '/v3/mail/send',
body: {
personalizations: [{
to: [{ email: 'my.email@gmail.com' }],
subject: 'Greenwich Test'
}],
from: { email: 'noreply@email-app.firebaseapp.com' },
content: [{
type: 'text/plain',
value: 'Hello Joe! Can you hear me! Is the line still getting through?'
}]
}
});
sg.API(mailRequest, function (error, response) {
if (error) {
console.log('Mail not sent; see error message below.');
} else {
console.log('Mail sent successfully!');
}
console.log(response);
});
}
我可以通过将其粘贴到地址栏中在我的浏览器中成功触发:
https://us-central1-email-app.cloudfunctions.net/sendmail
在浏览器中输入此内容后,我会在五分钟内收到一封电子邮件。但是,我无法 Angular 触发此功能。
客户端Angular代码
下面是我的客户端代码。 contact-form.service.ts
包含提交按钮的功能。
<!-- contact-form.component.html -->
<form [formGroup]="formService.contactForm" (ngSubmit)="formService.onSubmitForm()">
<input type="text" formControlName="userFirstName">
<label class="first-name-footer">First Name</label>
<input type="text" formControlName="userLastName">
<label class="last-name-footer">Last Name</label>
<button type="submit">SUBMIT</button>
</form>
// contact-form.component.ts
import { Component } from '@angular/core';
import { ContactFormService } from './contact-form.service';
@Component({
selector: 'contact-form',
templateUrl: './contact-form.component.html',
styleUrls: ['./contact-content.component.css'],
providers: [ContactFormService]
})
export class ContactFormComponent {
constructor(public formService: ContactFormService) {
formService.buildForm();
}
}
// contact-form.service.ts
import { Injectable } from '@angular/core';
import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';
import { Http } from '@angular/http';
@Injectable()
export class ContactFormService {
constructor(public formBuilder: FormBuilder, public http: Http) { }
contactForm: FormGroup;
formSubmitted: boolean = false;
mailUrl = "https://us-central1-email-app.cloudfunctions.net/sendmail";
buildForm() {
this.contactForm = this.formBuilder.group({
userFirstName: this.formBuilder.control(null, Validators.required),
userLastName: this.formBuilder.control(null, Validators.required)
});
}
onSubmitForm() {
console.log(this.contactForm.value);
this.formSubmitted = true;
this.http.post(this.mailUrl, this.contactForm.value);
this.contactForm.reset();
}
}
当我点击提交按钮时,我的 Google 云函数无法触发,但 this.contactForm.value
正确显示在控制台中。
总而言之:如何让我的 Angular 提交按钮触发我的 google 云功能?当我在浏览器中使用 url 时,该功能成功触发,但我无法让我的 Angular 应用程序触发相同的功能。
您需要订阅任何 http 请求,否则您的电话将不会被提出
onSubmitForm() {
console.log(this.contactForm.value);
this.formSubmitted = true;
///////////////////////////////////////////////////////////////////
this.http.post(this.mailUrl, this.contactForm.value).subscribe();
///////////////////////////////////////////////////////////////////
this.contactForm.reset();
}
我正在尝试通过 Google Cloud Functions 设置 REST API 来发送电子邮件,供我的 Angular 应用程序使用,该应用程序由 Firebase 托管。我的问题是我无法获取我的 Angular 代码来触发我的 google 云功能。谁能解释一下出了什么问题?
服务器端Google云函数代码
我在 functions/index.js
中有这个 Google 云功能:
// index.js
const functions = require('firebase-functions');
const sg = require('sendgrid')(
process.env.SENDGRID_API_KEY || '<my-api-key-placed-here>'
);
exports.sendmail = functions.https.onRequest((req, res) => {
sendMail(req.body);
res.send("Mail Successfully Sent!");
})
function sendMail(formData) {
const mailRequest = sg.emptyRequest({
method: 'POST',
path: '/v3/mail/send',
body: {
personalizations: [{
to: [{ email: 'my.email@gmail.com' }],
subject: 'Greenwich Test'
}],
from: { email: 'noreply@email-app.firebaseapp.com' },
content: [{
type: 'text/plain',
value: 'Hello Joe! Can you hear me! Is the line still getting through?'
}]
}
});
sg.API(mailRequest, function (error, response) {
if (error) {
console.log('Mail not sent; see error message below.');
} else {
console.log('Mail sent successfully!');
}
console.log(response);
});
}
我可以通过将其粘贴到地址栏中在我的浏览器中成功触发:
https://us-central1-email-app.cloudfunctions.net/sendmail
在浏览器中输入此内容后,我会在五分钟内收到一封电子邮件。但是,我无法 Angular 触发此功能。
客户端Angular代码
下面是我的客户端代码。 contact-form.service.ts
包含提交按钮的功能。
<!-- contact-form.component.html -->
<form [formGroup]="formService.contactForm" (ngSubmit)="formService.onSubmitForm()">
<input type="text" formControlName="userFirstName">
<label class="first-name-footer">First Name</label>
<input type="text" formControlName="userLastName">
<label class="last-name-footer">Last Name</label>
<button type="submit">SUBMIT</button>
</form>
// contact-form.component.ts
import { Component } from '@angular/core';
import { ContactFormService } from './contact-form.service';
@Component({
selector: 'contact-form',
templateUrl: './contact-form.component.html',
styleUrls: ['./contact-content.component.css'],
providers: [ContactFormService]
})
export class ContactFormComponent {
constructor(public formService: ContactFormService) {
formService.buildForm();
}
}
// contact-form.service.ts
import { Injectable } from '@angular/core';
import { FormGroup, FormBuilder, FormControl, Validators } from '@angular/forms';
import { Http } from '@angular/http';
@Injectable()
export class ContactFormService {
constructor(public formBuilder: FormBuilder, public http: Http) { }
contactForm: FormGroup;
formSubmitted: boolean = false;
mailUrl = "https://us-central1-email-app.cloudfunctions.net/sendmail";
buildForm() {
this.contactForm = this.formBuilder.group({
userFirstName: this.formBuilder.control(null, Validators.required),
userLastName: this.formBuilder.control(null, Validators.required)
});
}
onSubmitForm() {
console.log(this.contactForm.value);
this.formSubmitted = true;
this.http.post(this.mailUrl, this.contactForm.value);
this.contactForm.reset();
}
}
当我点击提交按钮时,我的 Google 云函数无法触发,但 this.contactForm.value
正确显示在控制台中。
总而言之:如何让我的 Angular 提交按钮触发我的 google 云功能?当我在浏览器中使用 url 时,该功能成功触发,但我无法让我的 Angular 应用程序触发相同的功能。
您需要订阅任何 http 请求,否则您的电话将不会被提出
onSubmitForm() {
console.log(this.contactForm.value);
this.formSubmitted = true;
///////////////////////////////////////////////////////////////////
this.http.post(this.mailUrl, this.contactForm.value).subscribe();
///////////////////////////////////////////////////////////////////
this.contactForm.reset();
}