мое время отклика составляет около 150-300 мс, и если я скопирую ту же самую функцию в Node.js и вызову ее в функции запрос / ответ (в функции http.createServer), ответ будет в среднем около 4000 мс ... Я думаю, что-то с модулем извлечения узла.
аюсь создать сайт с Node.js и Google Drive API. Для этого после получения моего API-ключа от Google я могу перейти по следующей ссылке:
https://www.googleapis.com/drive/v3/files?q=%27{my folder ID}%27+in+parents&key={my API key}
и я получаю ответ как это:
{
"kind": "drive#fileList",
"incompleteSearch": false,
"files": [
{
"kind": "drive#file",
"id": "1MhS55q3ZmRyUxo_tPW3kqXuLIy-cAv1-",
"name": "Capture001.png",
"mimeType": "image/png"
},
{
"kind": "drive#file",
"id": "18y88x-DxOW4APcz6YGBFPVCeBB7eLPHC",
"name": "contact.html",
"mimeType": "text/html"
},
{
"kind": "drive#file",
"id": "1voNKTQv-kbyS-jJnsIXc-1OH1YudB3Xw4Dcvi6VKIqY",
"name": "test",
"mimeType": "application/vnd.google-apps.document"
},
{
"kind": "drive#file",
"id": "1QHbCATkynjDidEBjueVv4Qvh0ijfzV0S",
"name": "Copy of 5737-12, 5738-01 (Freidin).mp4",
"mimeType": "video/mp4"
},
{
"kind": "drive#file",
"id": "1u6VsnhYvvnEJlFXi_B7I-7DY4JkZP9mQ",
"name": "Copy of 5750-01-03 Mincha-Maftir, Sicha and dollars.mpg",
"mimeType": "video/mpeg"
}
]
}
и затем, если бы я (теоретически) получил идентификатор конкретного файла, я мог бы вставить это в этот URL:
https://www.googleapis.com/drive/v3/files/{my file ID}?alt=media&key={my api key}
Итак, я пытаюсь сделать сайт из этого с помощью node.js, чтобы, когда кто-то заходил на мой сайт / somename, то это «somename» получало доступ к значениям в словаре с идентификатором главной папки в Google Диске, с помощью API-ключ, а затем теоретически может получить доступ ко всем файлам / папкам в этой папке с помощью mysite / somename / file.png или /somename/contact.html или чего-то для отображения html-страниц, вот мой полный код попытки nodejs до сих пор (не пока не поддерживает подкаталоги), вы можете попробовать его с вашей собственной папкой на диске Google и ключом API, просто подключите его к объекту базы данных:
var http = require("http");
var fetch = require("node-fetch");
var gDriveFolder = (folderID, apiKey) => `https://www.googleapis.com/drive/v3/files?q=%27${folderID}%27+in+parents&key=${apiKey}`
var gDriveFile = (fileID, apiKey) => `https://www.googleapis.com/drive/v3/files/${fileID}?alt=media&key=${apiKey}`
var database = {
"coby": {
"apiKey":"{paste your API key here}",
"folder":"{paste the shared URL of your Google Drive folder here}"
}
}
var server = http.createServer((request, response) => {
var urlParts = request.url.split("/").filter(x => x.length > 0).map(x => x.split("%20").join(" "));
if(urlParts[0] != "favicon.ico") { //to not make more than neccesary requests
var html = "";
var json = database;
if(json) {
console.log("We have a JSON!", json);
if(urlParts.length > 0) {
var folderWentTo = urlParts[0];
var myData = null;
for(var k in database) {
if(k == folderWentTo) {
myData = json[k];
break;
}
console.log(k, ":", json[k]);
}
}
if(myData) {
var key = myData["apiKey"];
var mainFolderURL = gDriveFolder(IDfromDriveURL(myData["folder"]),key);
console.log("main folder: ", mainFolderURL);
myReq(mainFolderURL, (data) => {
var fileList = JSONorNull(data);
console.log("key???",key);
if(fileList) {
var html = "<b>nothing</b><br>";
var f = fileList["files"];
if(f) {
if(urlParts.length > 1) {
var fileObject = f.filter(x=>x["name"] == urlParts[1])[0];
if(fileObject) {
var fileID = fileObject["id"];
var fileRequestedURL = gDriveFile(fileID, key);
console.log("trying to get contents of ", fileRequestedURL);
myReq(fileRequestedURL, (fileData) => {
html = fileData;
console.log(fileObject["mimeType"]);
// console.log("file: ", fileObject["name"], "'s content: ", fileData);
// response.setHeader("Content-Type",fileObject["mimeType"]);
response.end(html);
});
} else {
html = "file not found!";
console.log("tried to find: ", urlParts[1], " in list: ", f);
response.end(html);
}
} else {
console.log("loaded");
f.forEach((y, o) => {
// var fileURL = gDriveFile(y["id"], myData["apiKey"]);
html += `<a href="${urlParts[0]}/${y["name"]}">${y["name"]}</a><br>`
});
response.end(html);
console.log("printed");
}
} else {
response.end(html);
}
} else {
response.end("this data: " + data + " went wrong");
}
});
} else {
html = ("asdf")
response.end(html);
}
console.log("url parts:", urlParts);
} else {
console.log("no json :(");
response.end("dude what happened with the JSON: " + json + ", from " + bdy);
}
}
});
server.listen(80);
function myReq(url, cb) {
var start = parseInt(Date.now());
console.log("started", start);
fetch(url).then(res => res.text()).then(body => {
var end = parseInt(Date.now());
console.log("ended at",end, " total:",(end-start));
if(cb) {
cb(body);
}
});
}
function JSONorNull(str) {
var result = null;
try {
result = JSON.parse(str);
} catch(e) {
console.log(str, " has an error: ", e);
}
return result;
}
function IDfromDriveURL(url) {
return url.split("/").length > 1 ? (url.split("/").filter(x=>x.includes("open"))).join("").replace("open?id=", "") : url;
}
проблема: в настоящее время я использую node-fetch для получения контента, как вы можете видеть в функции myReq, но, похоже, это занимает ДЛИННОЕ время, IDK, если это просто Google API, но я сомневаюсь в этом, я думаю, что это как я получаю контент ... Когда я пытаюсь получить простое изображение размером 800 Кбайт с помощью localhost / coby / Capture1.png, оно печатается в моей консоли (из функции myReq):
started 1550048095674
ended at 1550048130691 total: 35017
это означает, что для загрузки (и автоматической загрузки) картинки потребовалось 35 секунд ... Также только для главной страницы localhost / coby, результат составляет от 2500мс до 4440мс ....
Ясно, что либо что-то не так с API накопителя (в чем я сомневаюсь), либо выборка узла просто работает очень медленно ...
Итак: какой самый быстрый способ получить содержимое страницы (и нескольких страниц, например, что я делаю) в node.js? Я попробовал модуль запроса, но он также медленный и предположительно выборка должна быть быстрее ...
Попробуйте протестировать его с помощью собственной папки на диске Google и дайте мне знать, работает ли он быстро или нет.
ОБНОВИТЬ Кстати, если я просто скопировать эту функцию (и запустить ее):
function coby2() {
var startTime = Date.now();
const drive_url = "https://www.googleapis.com/drive/v3/files?q=%27{my file id}%27+in+parents&key={myAPIkey}";
let drive_request = {
method: "GET",
/*headers: new Headers({
Authorization: "Bearer "+access_token
})*/
}
fetch(drive_url, drive_request).then( response => {
var txt = response.json();
console.log(response, txt);
return(txt);
}).then( list => {
var endTime = Date.now();
console.log("Found files:",list.files, " with time total: ", (endTime - startTime));
});
}
мое время отклика составляет около 150-300 мс, и если я скопирую ту же самую функцию в Node.js и вызову ее в функции запрос / ответ (в функции http.createServer), ответ будет в среднем около 4000 мс ... Я думаю, что-то с модулем извлечения узла.