NodeJS和搜索查询的嵌套函数

时间:2016-11-23 08:47:52

标签: javascript angularjs node.js

再次美好的一天,hoomans!

我正在使用 NodeJS 处理这个小型网络应用。我的网页上有几个搜索功能。但我想问一下有关此搜索功能的嵌套函数。

我的代码实际上没有错误。它现在工作得很好,但我之所以这么说,我并不完全相信我的算法。

最初,结构是在搜索查询的后端部分,包含对数据库的搜索查询的整个代码块写在我的路由/成绩中的app.post()方法内。 js 文件。另一方面,前端用 AngularJS 写在位于 public / javascripts 目录中的单独文件中,该文件应根据请求使用提交按钮动态重新加载表元素。

我认为这不是一个好的算法概念,因为我正在考虑多个用户访问app.post()方法的情况,并可能导致某些我不知道的问题。

所以现在,我在想是否可以使用带回调和超时的嵌套函数。我不能清楚地描述这个,所以我只是粘贴代码。

我的路线中的原始代码:

路由/ grades.js

app.post('/grades', function(req, res, next){
    setTimeout(callback, 100);
    try{
        var reqObj = req.body;
        console.log("Request Object: " + reqObj["className"]);
        req.getConnection(function(err, conn){
            if(err){
                console.error('SQL Connection error: ', err);
                return next(err);
            }
            else{
                var insertSql = "SELECT Class_Name,Class_Code,Class_Instructor FROM classes WHERE Class_Name LIKE ?";
                var insertValues = [
                    '%' + reqObj["className"] + '%'
                ];
                var query = conn.query(insertSql, insertValues, function(err, result){
                    if(err){
                        console.error('SQL error: ', err);
                        return next(err);
                    }
                    var class_array = [];
                    for(var i=0; i<result.length; i++){
                        class_array.push(result[i]);
                    }
                    console.log(class_array.valueOf());
                    res.send([{
                        info:
                            class_array.valueOf()
                    }])
                });
            }
        });
    }
    catch(ex){
        console.err("Internal error: " + ex);
        return next(ex);
    }
});

现在,我修改了上面的routes / grades.js中的代码并使其更有意义(我认为大声笑),并且它没有任何错误。但是,我仍然想知道哪些代码具有更好的算法,或者它们是否都很糟糕。洛尔

路由/ grades.js

router.post('/grades', function(req, res, next){
    searchForClass(req, res, next, function(){
       console.log("Class Search Success");
    });
});

function searchForClass(req, res, next, callback){
    setTimeout(callback, 100);
    try{
        var reqObj = req.body;
        console.log("Request Object: " + reqObj["className"]);
        req.getConnection(function(err, conn){
            if(err){
                console.error('SQL Connection error: ', err);
                return next(err);
            }
            else{
                var insertSql = "SELECT Class_Name,Class_Code,Class_Instructor FROM classes WHERE Class_Name LIKE ?";
                var insertValues = [
                    '%' + reqObj["className"] + '%'
                ];
                var query = conn.query(insertSql, insertValues, function(err, result){
                    if(err){
                        console.error('SQL error: ', err);
                        return next(err);
                    }
                    var class_array = [];
                    for(var i=0; i<result.length; i++){
                        class_array.push(result[i]);
                    }
                    console.log(class_array.valueOf());
                    res.send([{
                        info:
                            class_array.valueOf()
                    }])
                });
            }
        });
    }
    catch(ex){
        console.err("Internal error: " + ex);
        return next(ex);
    }
};

与此同时,这是我搜索的前端代码。

公开/ Javascript角/ app.js

$scope.classFun = function(){
        console.log('clicked submit');
        $http({
            url: 'http://localhost:3000/grades',
            method: 'POST',
            data: $scope.data
        }).then(function (httpResponse){
            console.log('response', httpResponse);
            // console.log(Object.keys(httpResponse.data[0].info[0]).length);
            var tbody = document.getElementById("class_list_data");
            while(tbody.firstElementChild){
                tbody.removeChild(tbody.firstChild);
            }
            for(var i=0; i<httpResponse.data.length; i++){
                for(var j=0; j<httpResponse.data[i].info.length; j++){
                    var tr = document.createElement("tr");
                    var td = document.createElement("td");
                    td.appendChild(document.createTextNode(httpResponse.data[i].info[j].Class_Name.toString()));
                    tr.appendChild(td);
                    tbody.appendChild(tr);
                }
            }
        })
    }

我希望我正确地表达了我的问题,我真的希望你们能帮助我。

非常感谢!

1 个答案:

答案 0 :(得分:0)

您的代码中只有一个问题,我认为您不需要回调函数,因为它没有给出任何有用的含义。

setTimeout(callback, 100); //it fires the callback after 100ms no matter what

您不必担心多个客户端请求,因为每个请求都将在不同的范围内运行。

为了提高性能,使用带有&#34; LIKE&#34;的MySQL字符串搜索当表变大并且没有正确索引时,关键字非常慢。