javascript - Google Cloud Functions 结束时:使用 Axios 时超时
问题描述
我想使用带有 http 触发器的 Google Cloud 函数将数据写入 Google 电子表格。
以下代码是我的云功能:
exports.writeDataMaterialCollection = functions.https.onRequest(
(req, res) => {
if (req.method === "POST") {
console.log(req.body);
res.set("Access-Control-Allow-Origin", "*");
const sheets = google.sheets({ version: "v4" });
var jwt = getJwt();
var apiKey = getApiKey();
var spreadsheetId = "sheetIDxxxxxxxxx";
var range = "A:L";
var row = ["data"];
sheets.spreadsheets.values.append(
{
spreadsheetId: spreadsheetId,
range: range,
auth: jwt,
key: apiKey,
valueInputOption: "RAW",
resource: { values: [row] }
},
(err, result) => {
if (err) {
throw err;
} else {
console.log(result.data.updates.updatedRange);
res.status(200).send(result.data.updates.updatedRange);
}
}
);
}
}
);
当我发出 curl POST 请求时,数据会正确写入电子表格。
url -d '{"test": "wert"}' -X POST http://localhost:5001/XXXX/writeDataMaterialCollection
问题
我不明白的是,当我在 Vue.js 中使用 Axios 时,Google Cloud Function 返回 throw new Error("Function timed out.")
axios(
"http://localhost:5001/XXXXX/writeDataMaterialCollection",
{
method: "POST",
headers: {
"content-type": "application/json",
"Access-Control-Allow-Origin": "*"
},
data: {
daten1: 23
}
}
).then(response => (self.writeDataResult = response));
解决方案
如果您的函数达到这一点:
throw err;
它实际上不会终止该函数并将该错误传播给客户端。那是因为您从回调函数中抛出错误,而不是主函数。这也意味着函数将超时,因为没有响应被发送到客户端。
您应该做的是向客户端发送错误,以便函数可以正确终止,并且客户端可以接收错误。您可能还想考虑记录错误,这样您就可以在控制台中看到出了什么问题:
if (err) {
res.send(500);
console.error(err);
}
推荐阅读
- laravel - Laravel Homestead 有多个实例,其中一个说明站点无法访问
- c# - 从接口执行 EF_context.Database.ExecuteSqlRawAsync
- visual-studio-code - 如何让 Prettier 使用自动保存并保留重做日志
- android - Jetpack Compose Vertical Grid 单项跨度大小
- bash - 用于计数/验证管道的正则表达式
- facebook - 如何通过调用 Graph API 获取 facebook 用户元数据?
- wpf - 工具栏中的标签前景
- sql - 用于检查列值的唯一性的 SQL 查询
- python-2.7 - 从两个包中加载函数
- javascript - 将文本转换为标签变成实际的粗体文本?