Javascript Node.js回调函数没有';行不通

Javascript Node.js回调函数没有';行不通,javascript,node.js,Javascript,Node.js,我是node.js的初学者,我一直在使用一个简单的立方体计时器,但不幸的是,有些东西不起作用。在app.get中,当我运行sumOfSeconds(最佳)时,出现一个错误,告诉我fun(sumOfSolves中的最后一行)不是函数。然而,当我尝试在app.get之外运行sumOfSeconds时(我还更改了返回到console.log以便可以看到结果),一切都正常。有什么问题? 提前感谢;) var-sumOfSolves=[]; //创建每次总秒数的数组-用于Ao5、Ao12、最佳和最差 函数

我是node.js的初学者,我一直在使用一个简单的立方体计时器,但不幸的是,有些东西不起作用。在app.get中,当我运行sumOfSeconds(最佳)时,出现一个错误,告诉我fun(sumOfSolves中的最后一行)不是函数。然而,当我尝试在app.get之外运行sumOfSeconds时(我还更改了返回到console.log以便可以看到结果),一切都正常。有什么问题? 提前感谢;)

var-sumOfSolves=[];
//创建每次总秒数的数组-用于Ao5、Ao12、最佳和最差
函数sumOfSeconds(乐趣){
Time.find({},函数(err,data){
如果(错误)抛出错误;
sumOfSolves=[];
对于(变量i=0;i
您在
应用程序中将
最佳
最差
声明为
var
。获取
。不要这样做!为变量选择与函数声明不冲突的唯一名称

编辑: Javascript中的作用域与任何其他语言中的作用域一样重要,可能更重要,因为整个脚本本质上是全局作用域(全局作用域可以访问嵌套作用域中声明的变量)

此外,几乎所有的东西都是JS对象(参见6种基本类型)。因此,与允许变量和函数具有相同名称的语言不同,在JS中,给定名称只能有一个标识符。您可以“提升”名称
最佳
最差
,因此JS引擎使用了您的新定义而不是函数

如果您希望在将来避免此类问题,并且不必担心支持较旧的浏览器,请使用
let
而不是
var
let
来警告您


另外,至少在开发过程中,将:
“使用严格”
放在源文件的顶部。

app.get
中声明
best
best
var
。不要这样做!为变量选择与函数声明不冲突的唯一名称

编辑: Javascript中的作用域与任何其他语言中的作用域一样重要,可能更重要,因为整个脚本本质上是全局作用域(全局作用域可以访问嵌套作用域中声明的变量)

此外,几乎所有的东西都是JS对象(参见6种基本类型)。因此,与允许变量和函数具有相同名称的语言不同,在JS中,给定名称只能有一个标识符。您可以“提升”名称
最佳
最差
,因此JS引擎使用了您的新定义而不是函数

如果您希望在将来避免此类问题,并且不必担心支持较旧的浏览器,请使用
let
而不是
var
let
来警告您


另外,至少在开发过程中,放:
“使用严格”;
位于源文件顶部。

欢迎使用Stack Overflow!这是一个很好的答案开始,但您应该充实一下-例如,我理解您的答案,因为我发现了
best
best
的重新声明,但是是node.js的初学者(如OP)可能不理解。请尝试解释到底出了什么问题。欢迎使用Stack Overflow!这是回答问题的良好开端,但您应该充实一下-例如,我理解您的回答,因为我发现了
best
Bast
的重新声明,但是node.js的初学者(如OP)可能不明白。试着解释到底出了什么问题。
var sumOfSolves = [];

//create an array of total seconds in each time - used for Ao5, Ao12, best and worst
function sumOfSeconds(fun){
    Time.find({}, function(err, data){
        if(err) throw err;
        sumOfSolves = [];
        for(var i = 0; i < data.length; i++){
            sum = data[i].min * 60 + data[i].sec;
            sumOfSolves.push(sum);
        }
        fun(); //this makes best(), worst(), Ao5(), Ao12 execute after sumOfSeconds finished everything else, 
        //otherwise those functions run before the sumOfSolves array had something in ot and therefore the code didn't work
    })
}

function best(){
    var best = Math.min(...sumOfSolves);
    var position = sumOfSolves.indexOf(best);
    Time.find({}, function(err, data){
        if(err) throw err;
        var bestTime = data[position].time;
        return bestTime
    })
}
function worst(){
    var worst = Math.max(...sumOfSolves);
    var position = sumOfSolves.indexOf(worst)
    Time.find({}, function(err, data){
        if(err) throw err;
        var worstTime = data[position].time;
        return worstTime;
    })
}
function Ao5(){

}
function Ao12(){

}

module.exports = function(app){
    app.get('/', function(req, res){
        var best = sumOfSeconds(best);
        var worst = sumOfSeconds(worst);
        Time.find({}, function(err, data){
            if(err) throw err;
            res.render('index', {times: data, best: best, worst: worst});
        })
    });