节点.js + 续集 + 查询执行

node.js + sequelize + query execution

本文关键字:执行 查询 续集 节点 js      更新时间:2023-09-26

在我的节点应用程序中,我正在使用续集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 个输出时,由于异步调用,它最终显示为空。请帮我解决这个问题。提前谢谢。

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

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"}

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

要么

按照@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的工作方式相反(非阻塞)