如何使用Sequelizejs一起解决多个查询



我有这个基本的nodejs脚本:

var express = require('express'),
  Sequelize = require('sequelize'),
  promise = require('bluebird'),
  app = express(),
  optimus = new Sequelize('optimus', 'root', 'test', {host: '127.0.0.1', dialect: 'mysql'}),
  query = 'SELECT id FROM borrowers LIMIT 0,10',
  query2 = 'SELECT COUNT(*) FROM borrowers';
app.get('/', function(req,res) {
  var chain = new Sequelize.Utils.QueryChainer();
  console.log('begin');
  chain.add(optimus, 'query', [query,null,null,[]])
    .add(optimus, 'query', [query2,null,null,[]])
    .run()
    .success(function() {
      console.log('done');
    }).error(function(err) {
      console.log('oh no');
    });
  console.log('end');
  res.send('Hi Ma!');
});
var server = app.listen(3000, function() {
    console.log('Listening on port %d', server.address().port);
  }
);

"done"one_answers"oh no"都不会开火,这让我相信我可以用这种方式"连锁原始查询"。

我真正想完成的是异步解决这两个查询,并通过res.send()将结果传递回

我不得不承认,我是nodejs的一个完整的n00b,所以如果能深入了解如何正确构建它,我将不胜感激。

代码的主要问题是,您过早地向客户端/浏览器发送响应。不需要在app.get方法的末尾发送res.send-ing,而是需要在error回调中分别发送success内部的答案。给你:

var express = require('express'),
  Sequelize = require('sequelize'),
  promise = require('bluebird'),
  app = express(),
  optimus = new Sequelize('sequelize_test', 'root', null, {host: '127.0.0.1', dialect: 'mysql'}),
  query = 'SELECT id FROM borrowers LIMIT 0,10',
  query2 = 'SELECT COUNT(*) as count FROM borrowers';
app.get('/', function(req,res) {
  var chain = new Sequelize.Utils.QueryChainer();
  console.log('begin');
  chain
    .add(optimus.query(query, null, { raw: true }))
    .add(optimus.query(query2, null, { raw: true, plain: true }))
    .run()
    .success(function(results) {
      res.send({
        resultOfQuery1: results[0],
        resultOfQuery2: results[1]
      });
    }).error(function(err) {
      console.log('oh no', err);
    });
});
var server = app.listen(3000, function() {
    console.log('Listening on port %d', server.address().port);
  }
);

请注意,我已将凭据更改为本地凭据。此外,还检查了chain.add的自变量。我们没有为即将到来的串行执行传递值,而是将实际的异步方法放入其中,并让querychainer处理它们的承诺。

最新更新