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

我正在开发一个项目,在这个项目中,我必须在多个表格中存储多个站点,一个路线及其关系。 我成功地存储停止和路线。 但要存储我需要获取最近存储的路线的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。 在这方面的任何帮助将不胜感激。

我遇到的另一个问题是,从busstop表中获取max(stopId)的查询将返回旧数据的值。 有时从routesmax(routeID)也有这个问题。

请帮我解决这个问题。

你的问题是一个非常常见的情况,不知道如何在Node.js中使用asynchronous函数。 您的查询是asynchronous的,这意味着节点将运行这些查询并继续执行您的页面上的其余代码。 但是,页面上的其他代码依赖于查询中的值。 一个常见的解决scheme是使用像async一样的库

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

我会通读这些来了解更多

http://nodeschool.io/#learnyounode

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