未定义forEach TypeError:undefined不是函数

时间:2016-02-29 14:37:39

标签: javascript node.js

我正在整合一个nodejs应用程序,以便从我经常访问的网站中检索我的奖励内容,并且在使用它时遇到问题。我试图找出如何将主题变量作为参数传递给我的profile.get函数。

尝试以下操作:

users.forEach(profile.get(topic));

结果:

users.forEach(profile.get(topic));
      ^
TypeError: undefined is not a function
    at Array.forEach (native)

app.js

var profile = require("./profile.js");
var topic = process.argv.slice(2,3);
var users = process.argv.slice(3);

users.forEach(profile.get);

profile.js

function get(username, topic) {
    //Connect to API URL (http://url.com/username.json)
    var request = https.get("https://url.com/" + username + ".json", function(response) {
        var body = "";
        //Read the data
        response.on('data', function(chunk) {
            body += chunk;
        });
        response.on('end', function() {
            if (response.statusCode == 200) {
                try {
                    //Parse the data
                    var profile = JSON.parse(body);
                    //Print the data
                    printer.printMessage(username, profile.badges.length, profile.points.topic, topic);
                } catch(error) {
                    //Parse Error
                    printer.printError(error);
                }
            } else {
                //Status Code Error
                printer.printError({message: "There was an error getting the profile for " + username + ".  (" + http.STATUS_CODES[response.statusCode] + ")"});
            }
        });
    });

    //Connection Error
    request.on('error', printer.printError);
}

更新:

的console.log(用户);

返回['myuserrname','secondusernamehere']

1 个答案:

答案 0 :(得分:6)

如果users包含要传递给.get()函数的用户名,那么你的循环将如下所示:

users.forEach(function(username) {
  profile.get(username, topic);
});

.forEach()方法调用您的回调函数,连续传递数组中的每个值。如果值是用户名,则每次调用回调都会为您提供一个用户名。假设topic值是在您发布的代码之外定义的值,它也会在回调中显示。

在您的尝试中,您直接致电profile.get()并将其返回值传递给.forEach()。该函数没有返回值,因此.forEach()抛出该异常的原因 - 您传递的回调值为undefined

your previous question about this code中,您正在使用只有一个参数的.get()函数版本。因此,使用

users.forEach(profile.get);

工作正常,因为您将引用传递给.get()函数到.forEach(),因此它有效。但是在这段代码中:

users.forEach(profile.get(topic));

profile.get(topic)是该函数的调用。这就是造成这个问题的原因。在JavaScript中,解决类似问题的方法(至少是最简单的直接方法)是在这个答案的顶部引入包装函数。现在,.forEach()很高兴,因为你传递了一个函数来调用,profile.get()很高兴,因为你传递了它所期望的两个参数。