мое время отклика составляет около 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 мс ... Я думаю, что-то с модулем извлечения узла.

Ответы на вопрос(0)

Ваш ответ на вопрос