【发布时间】:2019-03-25 10:26:41
【问题描述】:
您好,我正在尝试使用 Google Drive API 使用 NodeJS 更新 Google Doc,但出现此错误:
{
"error": {
"code": 500,
"message": null
}
}
以下是相关代码:
var j = new google.auth.JWT(
creds.client_email,
null,
creds.private_key,
[
"https://www.googleapis.com/auth/drive"
]
);
async function refreshTokens() {
startedWaiting = true;
return j.authorize((r,t) => {
startedWaiting = false;
timeTillNeedRefresh = t["expiry_date"] - Date.now();
setTimeout(function() {
refreshTokens();
// console.log("doing Q", Q);
}, timeTillNeedRefresh);
tokens = t;
console.log("GOT A TOKEN", tokens);
Q.forEach(x=>x());
Q = [];
});
}
async function start() {
await refreshTokens();
}
start();
function myFetch(opts) {
if(!opts) opts = {};
var cb = opts.cb || empty;
var headers = {
'Accept-Encoding': 'gzip',
'User-Agent': 'google-api-nodejs-client/0.7.2 (gzip)',
Authorization:tokens.token_type +" "+ tokens.access_token,
Accept:"application/json"
};
if(opts.headers) {
for(k in opts.headers) {
headers[k] = opts.headers[k];
}
}
fetch(
opts.url
|| "",
{
method:opts.method || "GET",
headers: headers
})
.then(res => res.text())
.then(body => {
cb(body);
});
}
updateFile({
id: "1vebqOamZ9QB4HqfUaQN-U9Zt4y33eij-I21glMvaPVQ",
content: "hi there"
});
async function allFuncs(tmp) {
if(tokens === null) {
console.log("DOING it later")
Q.push(tmp);
await refreshTokens();
} else if(startedWaiting || timeTillNeedRefresh <= 0) {
console.log("NOT for a while");
Q.push(tmp);
} else {
console.log("THIS is what should happen");
start = Date.now();
tmp();
}
}
async function updateFile(opts) {
var id = opts.id,
content = opts.content || "";
if(id) {
allFuncs(() => {
myFetch({
url:`https://www.googleapis.com/upload/drive/v3/files/${id}?uploadType=media`,
method:"PATCH",
headers: {
body: opts.content,
"Content-Type": "application/vnd.google-apps.document"
},
cb(b) {
console.log(b, "DID I DO IT?!");
}
});
});
}
}
我尝试查找此错误的含义,但找不到与 nodejs 相关的任何内容... 有谁知道这是标题问题还是有什么办法可以解决?
我不知道是否可以使用服务密钥,或者您是否必须验证用户才能这样做??
如果服务密钥电子邮件似乎具有文件的编辑权限,它应该能够随意编辑它。
【问题讨论】:
-
为了纠正你的情况,我可以问你关于你的问题吗? 1. 你想用
hi there的文字覆盖谷歌文档吗? 2. Google 文档是否与服务帐户共享? 3. Node.js的googleapis能用吗? 4. 您是否只需要使用 Drive API?例如,使用 Google Docs API 怎么样? -
@Tanaike 是的,是的,是的,我目前只是使用驱动器 API 我不知道现在 doc 和驱动器 API 之间存在差异,我可以使用我需要的任何东西
-
感谢您的回复。我能理解你的问题。我提出了一个示例脚本作为答案。你能确认一下吗?如果这不是您想要的结果,我深表歉意。
-
我的回答是否向您展示了您想要的结果?你能告诉我吗?这对我学习也很有用。如果这可行,与您有相同问题的其他人也可以将您的问题作为可以解决的问题。如果您对我的回答有疑问,我深表歉意。到时候,可以问一下你现在的情况吗?我想学习解决你的问题。
-
@Tanaike 是的,虽然我确实说过我可以使用 googleAPI,但我没有提到如果没有它我会感兴趣;仅仅使用 GET 请求,你知道怎么做吗?
标签: node.js google-drive-api google-apis-explorer