首页 > 解决方案 > 无法从 API 请求向控制器发送数据

问题描述

我正在尝试从谷歌驱动器获取用户表单的列表。这是下面的代码(我的 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),但是它没有发送任何响应。任何帮助或提示表示赞赏。在此先感谢。

标签: angularjsnode.jsgoogle-apimean-stack

解决方案


您需要了解异步编程,您需要使用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);
            });
        }
    });
});

推荐阅读