Angular http.post => Cloud Function:从POST读取数据

时间:2018-11-16 19:00:12

标签: angular firebase http google-cloud-functions

我正在尝试从Angular向Google Cloud Function进行简单的POST请求(使用@angular/common/http),但是v7的Angular http文档几乎没有提供任何详尽的示例,没有列出如何附加数据或反对请求。

我的Angular代码:

    const url = 'example.com/this/that';

    const httpOptions = {
        headers: new HttpHeaders({
            'Content-Type': 'application/json', 
            'Access-Control-Allow-Origin': '*'
        })
    };

    const data = {
        "id": id, 
        "name": name
    }

    return this.http.post(url, data, httpOptions)
        .subscribe(res => {
            console.log(res);
        });

还有我的Google Cloud Function:

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

    return cors(request, response, () => {

        const id = request.query.id;
        const name = request.query.name;

        console.log('> > > > > > > 1.1 < < < < < < <');
        console.log(request);

        if (!name || !id) {
            return response.status(400).send(`Missing parameters`);
        }

        return response.status(200).send(`Thank you for id ${id} and name ${name}.`);

    });
});

我总是得到400,“缺少参数”。我也尝试过request.body.id。知道我在做什么错吗?谢谢!

编辑

在客户端控制台中误读了错误,req.body确实在起作用。我遇到了解析错误。添加错误图片

此外,我已经发布了一个解决方案来回答这个问题。也感谢道格的帮助,req.query确实是错误的。

enter image description here

2 个答案:

答案 0 :(得分:1)

对于Express Request对象,request.query指直接通过URL中的查询字符串输入的参数。您没有通过这种方式传递任何东西,因此最终将得到一个空对象。

Cloud Functions应该automatically parse the request body格式化为JSON,并将结果放入request.body中,因此请使用它来访问您的ID和名称。

答案 1 :(得分:0)

解决方案是 不要在res.status(200).sent('some string here');中发送字符串 ,而是 发送对象

(在Google Cloud Function 响应中):

res.status(200).send({status: 200, message: `Thank you for id ${id}`});