无法将数据从API请求发送到Controller

问题描述 投票:0回答:1

我试图从google drive获取用户表单的列表。这是下面的代码(我的API中的GET请求):

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);
            }

        });
    });

问题是在设置凭据之后我试图通过listFiles函数将数据发送到我的控制器(AngularJS),该函数访问所有表单,但它不会发送任何响应。任何帮助或暗示赞赏。谢谢提前。

angularjs node.js google-api mean-stack
1个回答
0
投票

您需要了解异步编程,要么需要使用callbackPromise,要么只需在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);
            });
        }
    });
});
© www.soinside.com 2019 - 2024. All rights reserved.