Sails.js查询在函数结束时运行

时间:2014-10-11 17:16:58

标签: mysql node.js sails.js

我正在开展一个项目,我必须在3个不同的表格中存储多个停靠点,一条路线及其关系。我成功地存储了停靠点和路线。但是要存储我需要获得最近存储的路径的id(自动生成的主键)和所有最近存储的停靠点的关系。我通过运行查询来查找最大存储ID的最大ID。这是我的代码:

create: function (req,res,next)
    {

        var stopsArray = req.param('latLngArray');

        var so="";
        var totalBusStops = req.param('totalStops');

        var routeToSave=new OneRoute();
        routeToSave.routeName="This route";
        routeToSave.totalStops=totalBusStops;

        Routes.create(routeToSave, function routeCreated(err, routeToSave){
            if(err) return next(err);
                res.json(routeToSave); 
        });   // creating routes

        for(var i=0;i<stopsArray.length;i++){
            var us = new busStop();
            us.lngPos = stopsArray[i].Lng;
            us.latPos = stopsArray[i].Lat;

            BusStop.create( us ,function stopCreated (err,us)
            { 
                if(err) return next(err);
                res.json(us);   
            });  // creating bus stops#
        }

        var currentRouteId = "";
        Routes.query("select max(routeId) from routes",  function(err, results) {
            if(err){ res.json({ error: err.message }, 400);}
            else{
                currentRouteId = results[0]['max(routeId)'];
                console.log("route ID: "+results[0]['max(routeId)']);
            }
        });   // max riute ID

        var relation= new routeStopR();
        relation.routeId=currentRouteId;
        var currentStopId = "";

        BusStop.query("select max(stopId) from busstop",  function(err, results) {
            if(err){res.json({ error: err.message }, 400);}
            else{

                currentStopId = results[0]['max(stopId)'];
                console.log("Bus Stop ID: "+currentStopId);
            }
        });

        relation.stopId=currentStopId;

        console.log("");
        console.log("relation Route: "+relation.routeId);
        console.log("relation Stop: "+relation.stopId);


        RouteStops.create(relation,function relationCreated (err,relation)
        {
            if(err) return next(err);
            res.json(relation);
        });

    }

我面临的问题是,无论我把它们放在函数的哪个位置,get查询都会在函数的末尾运行。由于这个原因,我无法使用我从查询中获得的id。在这方面的任何帮助将不胜感激。

我面临的另一个问题是从max(stopId)表获取busstop的查询从旧数据返回值。有时来自max(routeID)的{​​{1}}也有这个问题。

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:2)

您的问题是一个非常常见的情况,不知道如何在Node.js中使用异步函数。您的查询是异步的,这意味着节点会运行这些查询并继续执行页面上的其余代码。但是,页面上的其余代码取决于查询中的值。一个常见的解决方案是使用像async

这样的库

https://www.npmjs.org/package/async

我会通读这些以了解更多

http://nodeschool.io/#learnyounode

http://javascriptplayground.com/blog/2013/06/think-async/