Azure移动服务:使用共享脚本将Google用户解析为其电子邮件地址会导致错误和挫败感

时间:2014-08-07 14:11:58

标签: azure azure-mobile-services

我有一点时间让这个简单的功能在移动服务中工作。我跟踪了Carlos Figuira关于在移动服务中使用扩展登录范围的优秀帖子,并创建了一个新的共享脚本,我的目的是获取当前登录的用户并从Google服务中检索他们的电子邮件地址。我首先查看Users表,看看它们是否有记录。如果没有,我会从Google API中获取信息,然后将信息存储在“用户”表中。最终,我的函数返回电子邮件地址。原因是我们使用他们用来登录Google的电子邮件地址将用户与记录相关联(我们知道他们的电子邮件地址,而不是时髦的Google ID)。

但是,我在调用共享脚本时收到错误。我甚至不确定脚本本身是否正确。我在我的git存储库的共享文件夹中创建了一个名为helpers.js的文件。这是共享脚本:

exports.getUserEmail = function (user) {
    return 'test';
    // The table object is the Users table for caching data.
    var table = request.service.tables.getTable(‘Users’);
    var cachedIdentities;
    var email = '';
    user.getIdentities({
        success: function (identities) {
            cachedIdentities = identities;

            table.where({
                userid: user.userid
            }).read({
                success: insertItemIfNotExists
            });

            function insertItemIfNotExists(existingItems) {
                if (existingItems.length > 0) {
                    // Return the email address stored in the users table:
                    email = existingItems[0].email;
                    return email;
                } else {
                    // Insert the user information into the Users table and return the email address:
                    var req = require('request');
                    if (cachedIdentities.google) {
                        var googleAccessToken = cachedIdentities.google.accessToken;
                        var url = 'https://www.googleapis.com/oauth2/v3/userinfo?access_token=' + googleAccessToken;
                        req(url, function (err, resp, body) {
                            if (err || resp.statusCode !== 200) {
                                console.error('Error sending data to Google API: ', err);
                                // TODO: send error feedback to calling script.
                                //request.respond(statusCodes.INTERNAL_SERVER_ERROR, body);
                            } else {
                                try {
                                    var userData = JSON.parse(body);
                                    var item = {
                                        userid: user.userid,
                                        username: userData.name,
                                        email: userData.email
                                    };
                                    // Set the email return value.
                                    email = item.email;
                                    // Cache our user data.
                                    table.insert(item, {
                                        success: function () {
                                            return email;
                                        },
                                        error: function (err) {
                                            console.error('Error inserting user Google data into Users table: ', err);
                                            return email;
                                        }
                                    });
                                } catch (ex) {
                                    console.error('Error parsing response from Google API: ', ex);
                                    // TODO: send error feedback to the calling script.
                                    //request.respond(statusCodes.INTERNAL_SERVER_ERROR, ex);
                                }
                            }
                        });
                    } else {
                        // Return empty email.
                        console.log("Could not retrieve user information for '%d'", user.userid);
                    }
                }
            }

        }
    });
}

当我从另一个脚本(Section.insert.js)引用脚本时,我这样做:

var helpers = require('../ shared / helpers.js');

调用此方法时,出现以下错误:

脚本'/table/Section.insert.js'出错。 SyntaxError:意外的标记ILLEGAL     [外部代码]     at Object.exports.require(D:\ home \ site \ wwwroot \ App_Data \ config \ scripts \ table__fxutil.js:9:12)     [外部代码]     在插入(:3:16)     at:1:8

在我看来,这似乎是一个node.js错误,指出没有注册/安装helpers.js模块。

我错过了什么吗?我通过git存储库将helpers.js文件添加到Azure,我的所有更改都显示正常。

另外,关于我的helpers.js文件中的“getUserEmail”脚本,我是否正确地采用了这种方式?

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,我解决了这个问题。在我的共享脚本(getUserEmail)中,我以某种方式使用反引号(`)而不是单引号引用了Users表。如果存在任何格式错误的字符串,则结果错误是node.js倾向于抛出的错误。