node.js + sequelize +查询执行

时间:2014-04-07 10:19:42

标签: javascript node.js sequelize.js

在我的节点应用程序中,我正在使用sequelize ORM。因为我必须执行3个查询,并且在执行完毕后我必须将这些结果组合成JSON格式。

我的疑问:

try {
    sequelize.query("select id_0, name_0, id_1, name_1 from xxxx group by id_0, name_0, id_1, name_1").success(function (result) {
        finalResult = result;

    })
} catch (err) {

}

try {
    sequelize.query("select yyyyyyyyyy(JSON datatype) as value from xxxxx limit 1").success(function (valueResults) {
        valueResults = valueResults[0].value;
        valueResults = JSON.parse(valueResults);
        for (var prop in valueResults) {
            keyResult.push(prop);
        }
    })
} catch (err) {

}

try {
    sequelize.query("select country_name, level0, level1, level2, level3, level4 from levels").success(function (result) {
        //console.log("ccccccc=" +util.inspect(levelsResult)); = result;
        levelsResult = result;

    })
} catch (err) {

}

我必须将3个输出合并为单个,我必须格式化为JSON。当我试图打印这3个输出时,由于异步调用,它会变为空。请帮我解决这个问题。谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用流量控制包来帮助解决此问题。有纯粹的JS方法,但像async或一些承诺实现的包也可以工作(除非你想要练习)。

async中的一个示例是async.seriesasync.parallel方法(如果需要顺序或并行,则不确定您的调用顺序)。像这样:

var async = require('async');

async.parallel({
  query1 : function( cb ){
    //perform query here. Put cb() inside callback, where you get results
    cb(null, "result1");
  },
  query2 : function( cb ){
    //perform query here. Put cb() inside callback, where you get results
    cb(null, "result2");
  },
  query3 : function( cb ){
    //perform query here. Put cb() inside callback, where you get results
    cb(null, "result3");
  }
},function parallelFinal(parallelErr, parallelResults){
  if( parallelErr ) throw new Error("Something bad!");
  console.log("Results are " + JSON.stringify( parallelResults ) );
});

结果:

  

结果是{" query1":" result1"," query2":" result2"," query3" :" result3"}

您可以根据需要在结果方法中设置和操作对象。

答案 1 :(得分:1)

要么使用@clay告诉你的解决方案,要么在查询回调中执行查询,也就是说:

var result1, result2, result3
try {
    sequelize.query("select foo from bar").success(function (foo) {
    result1 = foo;
    try {
        sequelize.query("select foo2 from bar2").success(function (bar) {
            result2 = bar;
            //do the 3rd query here
        });
    } catch (e) {

    }
})
} catch (err) {

}

请记住,当您想要执行多个查询时,此方法不实用,此方法是一个简单的阻塞代码,这与node.js的工作原理(非阻塞)相反