【发布时间】:2018-09-27 14:53:12
【问题描述】:
我正在尝试将时间戳字段从 Firebase Functions 发送到 BigQuery。 我正在发送 admin.firestore.FieldValue.serverTimestamp() BigQuery 上的字段是 TIMESTAMP 类型。
我收到一个错误:
table.insert: {"errors":[{"errors":[{"message":"This field is not a record.","reason":"invalid"}]}],"response":{"kind":"bigquery#tableDataInsertAllResponse","insertErrors":[{"index":0,"errors":[{"reason":"invalid","location":"datetime","debugInfo":"","message":"This field is not a record."}]}]},"message":"A failure occurred during this request."}
我的代码是:
exports.sessionsToBQ = functions.firestore
.document("/Users/{userId}/Sessions/{sessionId}")
.onWrite((change, context) => {
const dataset = bigquery.dataset('App');
const table = dataset.table('Sessions');
tableName = 'Sessions'
datasetName = 'App'
dataset.exists().catch(err => {
console.error(
`dataset.exists: dataset ${datasetName} does not exist: ${JSON.stringify(
err
)}`
)
return err
})
//let table = dataset.table(tableName)
table.exists().catch(err => {
console.error(
`table.exists: table ${tableName} does not exist: ${JSON.stringify(
err
)}`
)
return err
})
let row = {
insertId: context.params.sessionId,
json: {
sessionId: context.params.sessionId,
userId: context.params.userId,
datetime: admin.firestore.FieldValue.serverTimestamp(),
duration: change.after.data().duration,
distance: change.after.data().distance,
IP: change.after.data().IP
},
}
return table.insert(row, { raw: true }).catch(err => {
console.error(`table.insert: ${JSON.stringify(err)}`)
return err
})
})
我做错了什么?如何正确发送当前时间戳到大查询?
【问题讨论】:
-
如果我改用 Date.now(),那么在大查询中出现 50262-12-12 00:49:52.000 UTC
-
听起来
admin.firestore.FieldValue.serverTimestamp()不返回字符串,它返回某种需要先转换为字符串的对象。也许查阅该方法的文档以查看它返回的内容以及如何将其转换为字符串表示形式。 -
如果我尝试将其转换为字符串的 admin.firestore.FieldValue.serverTimestamp()+'' 我仍然收到错误
-
是的,但是字符串是什么?它可能不是时间戳格式。
-
在 Firestore 上看起来像这样:2018 年 4 月 15 日晚上 8:46:16 UTC+3
标签: firebase firebase-realtime-database google-bigquery google-cloud-firestore google-cloud-functions