【问题标题】:core.js:6272 ERROR Error: Uncaught (in promise): HttpErrorResponse: {"headers":{"normalizedNames" SendGrid and Cloud Firestorecore.js:6272 错误错误:未捕获(承诺):HttpErrorResponse:{“headers”:{“normalizedNames”SendGrid 和 Cloud Firestore
【发布时间】:2020-11-13 14:41:16
【问题描述】:

我使用了带有 Firebase Cloud 功能的 SendGrid NodeJS 库。它工作正常,我可以发送电子邮件。但在 Cloud 函数下方发生火灾后,它在 Ionic/Angular 客户端应用程序的控制台上显示以下错误。你知道为什么吗?

     core.js:6272 ERROR Error: Uncaught (in promise): 
     HttpErrorResponse: {"headers":{"normalizedNames":
    {},"lazyUpdate":null},"status":200,"statusText":"OK","url":"https://my-
    app.cloudfunctions.net/sendEmail","ok":false,"name":"HttpErrorResponse","message"
    :"Http failure during parsing for https://my-
    app.cloudfunctions.net/sendEmail","error":{"error":{},"text":"success"}}
            at resolvePromise (zone-evergreen.js:793)
            at zone-evergreen.js:707
            at SafeSubscriber._error (Observable.js:91)
            at SafeSubscriber.__tryOrUnsub (Subscriber.js:183)
            at SafeSubscriber.error (Subscriber.js:135)
            at Subscriber._error (Subscriber.js:75)
            at Subscriber.error (Subscriber.js:55)
            at MapSubscriber._error (Subscriber.js:75)
            at MapSubscriber.error (Subscriber.js:55)
            at FilterSubscriber._error (Subscriber.js:75)

package.json

{
  "name": "functions",
  "scripts": {
    "lint": "tslint --project tsconfig.json",
    "build": "tsc",
    "serve": "npm run build && firebase emulators:start --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "10"
  },
  "main": "lib/index.js",
  "dependencies": {
    "@sendgrid/mail": "^7.2.1",
    "@types/cors": "^2.8.6",
    "axios": "^0.19.2",
    "cors": "^2.8.5",
    "firebase-admin": "^8.10.0",
    "firebase-functions": "^3.6.1"
  },
  "devDependencies": {
    "tslint": "^5.12.0",
    "typescript": "^3.8.0",
    "firebase-functions-test": "^0.2.0"
  },
  "private": true
}

云功能

import * as functions from 'firebase-functions';
import * as sgMail from '@sendgrid/mail';
import * as cors from 'cors';

const corsHandler = cors({ origin: true });

export const sendEmail = functions.https.onRequest((request, response) => {

    return corsHandler(request, response, async () => {

        const apiKey = functions.config().sendgrid.key;
        const emailTemplateId = functions.config().sendgrid.template;

        sgMail.setApiKey(apiKey);

        const email = {
            templateId: emailTemplateId,
            from: 'me@y.com',
            to: 'me@y.com',
            dynamic_template_data: {
                firstName: request.body.firstName,
                lastName: request.body.lastName,
             },
        };

        try {
            await sgMail.send(email);
            response.send('success');

        } catch (err) {
            console.log("Send Email request failure", err);
            response.send('failure');
        }
    });
});

客户端应用的服务

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { environment } from 'src/environments/environment';
import { SellMyHouseModel } from 'src/app/models/sell-my-house.model';

@Injectable({
  providedIn: 'root'
})
export class SendEmailService {

  constructor(private httpClint: HttpClient) { }

  sendEmail(sellMyHouse: SellMyHouseModel): Promise<any> {
    return this.httpClint.post(environment.cloudFunctionUrl + 'sendEmail', sellMyHouse, this.createHeader('application/json')).toPromise();
  }

  private createHeader(contentType: string): any {
    return { headers: new HttpHeaders({ 'Content-Type': contentType }) };
  }

}

【问题讨论】:

  • 我不明白错误是在哪里触发的,但是错误消息告诉您在 Promise 期间触发了错误但没有被捕获。看看Promise's catch method
  • 在您客户的服务中也有一个错字,您使用了httpClint 而不是httpClient。不过,这不会导致代码出现问题。
  • @Ajordat 是的,是错字。我会解决的。谢谢!。你认为try/catch 会在这里提供更多信息吗?
  • try/catch 应该提供更多信息,是的。你能解决你的问题吗?
  • @asbovelw 我已经给出了答案。请看。

标签: angular firebase ionic-framework google-cloud-functions sendgrid


【解决方案1】:

我已经这样做了,没有更多的问题。即responseType: 'text'

 private createHeader(contentType: string): any {
    return { headers: new HttpHeaders({ 'Content-Type': contentType }), responseType: 'text' };
  }

【讨论】:

  • 你拯救了我的一天。我的 api 返回纯字符串,但请求的默认响应类型是 json。所以我们需要修复其中任何一个地方。
猜你喜欢
  • 2021-07-14
  • 2022-12-19
  • 2021-03-03
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 2020-06-03
  • 2018-10-12
相关资源
最近更新 更多