如何在knex [Node]中运行同步查询

时间:2014-09-16 13:17:18

标签: node.js asynchronous knex.js

如何在节点中的knex db中生成同步方式。 http://knexjs.org/#Promises-then

knex.select('*').from('users').where({name: 'Tim'})
  .then(function(id) {
    console.log('Inserted Account ' + id);
  })

我想要这样的东西

knex.select('*').from('users').where({name: 'Tim'})
  .sync().then(function(id) {
    console.log('Inserted Account ' + id);
  }); // code should not continue to run until completing then function

如何使异步lib运行多个并行任务并以同步代码返回结果。像下面或类似的东西

               var results=async.sync().parallel([
                    task1,task2
                ],function(err, res){
                    results=res;
                }); // anything like var results or sync()
                console.log(results);   

2 个答案:

答案 0 :(得分:0)

我会质疑你需要在"同步模式"中运行。您可以建立一些流量控制,最糟糕的是,您可能会严重影响NodeJS服务器。由于NodeJS的单线程架构,您的建议是让所有其他事件/用户等到当前操作调用DB并返回。这不是NodeJS的好用。

从我的问题可以看出,像async.parallel这样的东西对你有用。

async.parallel({
  queryone: function( parCb ){
    var query = knex('users').select().where( 'name', 'Tim' );
    query.exec( function(err, results ) {
      parCb( err, results );
    } );
  },
  querytwo: function( parCb ){
    var query = knex('otherTable').select().where( 'name', 'Tim' );
    query.exec( function(err, results ) {
      parCb( err, results );
    } );
  },
},
function(err, results) {
  //Results are all ready, containing the results of two different queries
  console.log( 'Results for queryone: ' + JSON.stringify( results.queryone ) );
  console.log( 'Results for querytwo: ' + JSON.stringify( results.querytwo ) );
});

此处,当您到达function(err,results)回调时,results会填充两个查询中的数据,并行执行。所有这些都没有完全阻止你的其他事件。

答案 1 :(得分:0)

你可以这样做:

async getOne(table, { fields = '*', filters = {} }) {
     const promise = new Promise(async (resolve, reject) => {                
        knex(table).where(filters).select(fields).first().then((result) => {
            resolve(result);
        }).catch((err) => resolve({}));
     });

     return await promise;
}

然后

let data = (await getOne('demo', {})).map(d => return d);

现在数据变量是一个数组。