我正在尝试从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
确实是错误的。
答案 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}`});