Не удается отправить данные из запроса API в контроллер - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь получить список формы пользователя с Google Drive. Вот код ниже (запрос GET в моем API):

router.get("/googleToken", function (req, res) {        

        // Function to retrieve forms after AUTH
        function listFiles(auth) {
            const drive = google.drive({version: 'v3', auth});
            drive.files.list({
              q: "mimeType='application/vnd.google-apps.form'",
              fields: 'nextPageToken, files(id, name)',
            }, (err, res) => {
              if (err) return console.log('The API returned an error: ' + err);
              var files = res.data.files;
              // Callback function to return files
              function callback() { return files; }; 
              if (files.length) {
                // CALL callback to return data
                callback();
              } else {
                console.log('No files found.');
              }
            });
          }

        var code = req.query.code;

        oauth2Client.getToken(code, function (err, tokens) {
            if (err) {
                console.log(err);
                res.send(err);
                return;
            }
            else {
                oauth2Client.setCredentials(tokens);
                var forms = listFiles(oauth2Client);
                res.send(forms);
            }

        });
    });

Проблема в том, что я пытаюсь установить учетные данныеотправлять данные в мой контроллер (AngularJS) с помощью функции listFiles, которая обращается ко всем формам, однако ничего не отправляет в ответ.Любая помощь или подсказка приветствуется. Спасибо заранее.

1 Ответ

0 голосов
/ 17 сентября 2018

Вам необходимо разбираться в асинхронном программировании, либо вам нужно использовать callback или Promise, либо просто вызывать функцию res.send() внутри функции listFiles, следующий пример может помочь вам

router.get("/googleToken", function (req, res) {

    // Function to retrieve forms after AUTH
    function listFiles(auth) {
        const drive = google.drive({
            version: 'v3',
            auth
        });
        drive.files.list({
            q: "mimeType='application/vnd.google-apps.form'",
            fields: 'nextPageToken, files(id, name)',
        }, (err, res) => {
            if (err) {
                console.log('The API returned an error: ' + err);
                return res.status(500).send(err);
            }
            var files = res.data.files;

            if (files.length) {
                return res.send(files);
            } else {
                console.log('No files found.');
                return res.status(400).send({message: 'No files found.'});
            }
        });
    }

    var code = req.query.code;

    oauth2Client.getToken(code, function (err, tokens) {
        if (err) {
            console.log(err);
            return res.send(err);
        } else {
            oauth2Client.setCredentials(tokens);
            listFiles(oauth2Client);
        }
    });
});

В следующем примере используется Promise

router.get("/googleToken", function (req, res) {

    // Function to retrieve forms after AUTH
    function listFiles(auth) {
        return new Promise(function (resolve, reject) {
            const drive = google.drive({
                version: 'v3',
                auth
            });
            drive.files.list({
                q: "mimeType='application/vnd.google-apps.form'",
                fields: 'nextPageToken, files(id, name)',
            }, (err, res) => {
                if (err) {
                    console.log('The API returned an error: ' + err);
                    return reject(err);
                }
                var files = res.data.files;

                if (files.length) {
                    return resolve(files);
                } else {
                    console.log('No files found.');
                    return reject({message: 'No files found.'});
                }
            });
        });
    }

    var code = req.query.code;

    oauth2Client.getToken(code, function (err, tokens) {
        if (err) {
            console.log(err);
            return res.send(err);
        } else {
            oauth2Client.setCredentials(tokens);
            listFiles(oauth2Client)
            .then( function(files) {
                res.send(files);
            })
            .catch( function(err) {
                console.log(err);
                res.send(err);
            });
        }
    });
});
...