我在 Express 路由器代码中,使用 Jade 进行渲染并从 MongoDB 中提取数据以为此做准备。与以下构造相比,是否有更好的方法将所需的所有数据汇总在一起?请注意,表 restaurants、customers 和 drivers 之间没有依赖关系,要求先返回一个——我只需要在页面呈现之前执行所有三个。
在某些情况下,这些级联调用中的一些会变得非常深入。必须有更好的结构,对吧?
router.get('/iframe_map/:restaurantid/:customerid', function(req, res, next) {
Restaurant.findOne({'_id': req.params.restaurantid}, '-_id address name phone status lat lng LatLng marker', function(restaurantErr, restaurantDoc) {
Customer.findOne({'_id': req.params.customerid}, '-_id address name phone status lat lng LatLng marker', function(customerErr, customerDoc) {
Driver.find({}, '-_id letterOrdinal address firstName lastName phone status lat lng LatLng marker', {sort: {letterOrdinal: 1}}, function(driverErr, driverDocs) {
res.render('iframe_map', {
title: "Google Map",
defaultZoomLevel: 12,
defaultCityState: ", San Diego, CA",
oRestaurant: restaurantDoc,
oCustomer: customerDoc,
oDrivers: driverDocs
}); // End of res.render()
}); // End of Driver.find()
}); // End of Customer.find()
}); // End of Restaurant.find()
}); // End of router.get()
最佳答案
这是用 Async Waterfall 重写的代码:
router.get('/iframe_map/:restaurantid/:customerid', function(req, res, next) {
var obj = {};
async.waterfall([
function(done) {
Restaurant.findOne({'_id': req.params.restaurantid}, '-_id address name phone status lat lng LatLng marker', function(err, items) {
if (err) done(err);
obj.restaurant = items;
done(null, obj);
});
},
function(obj, done) {
Customer.findOne({'_id': req.params.customerid}, '-_id address name phone status lat lng LatLng marker', function(err, items) {
if (err) done(err);
obj.customer = items;
done(null, obj);
});
},
function(obj, done) {
Driver.find({}, '-_id letterOrdinal address firstName lastName phone status lat lng LatLng marker', {sort: {letterOrdinal: 1}}, function(err, items) {
if (err) done(err);
obj.driver = items;
done(null, obj);
});
}
], function (err, result) {
res.render('iframe_map', {
title: "Google Map",
defaultZoomLevel: 12,
defaultCityState: ", San Diego, CA",
oRestaurant: result.restaurant,
oCustomer: result.customer,
oDrivers: result.driver
});
});
});
关于node.js - 有没有比堆叠它们更好的依赖函数调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30968760/
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin
“输出”是一个序列化的OpenStruct。定义标题try(:output).try(:data).try(:title)结束什么会更好?:) 最佳答案 或者只是这样:deftitleoutput.data.titlerescuenilend 关于ruby-on-rails-更好的替代方法try(:output).try(:data).try(:name)?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r
如何在Ruby中按名称传递函数?(我使用Ruby才几个小时,所以我还在想办法。)nums=[1,2,3,4]#Thisworks,butismoreverbosethanI'dlikenums.eachdo|i|putsiend#InJS,Icouldjustdosomethinglike:#nums.forEach(console.log)#InF#,itwouldbesomethinglike:#List.iternums(printf"%A")#InRuby,IwishIcoulddosomethinglike:nums.eachputs在Ruby中能不能做到类似的简洁?我可以只