node.js - 如何使用 Sequelizejs 一起解决多个查询

标签 node.js asynchronous sequelize.js

我有这个基本的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);
  }
);

“完成”和“哦不”都不会触发,这让我相信我可以以这种方式链接原始查询。

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

我必须承认自己是一个完全的 Nodejs 新手,所以任何关于如何正确构建它的见解将不胜感激。

最佳答案

您的代码的主要问题是您太早向客户端/浏览器发送响应。您需要在错误回调中分别在成功中发送答案,而不是在 app.get 方法末尾使用 res.send-ing。你在这里:

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 处理它们的 promise 。

关于node.js - 如何使用 Sequelizejs 一起解决多个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22964553/

相关文章:

node.js - "as"关键字有什么作用?

javascript - 如何使用 GraphQL 查询返回目录中的文件列表?

java - 为什么我的 @Async Future<T> 会阻塞?

mysql - 如何运行 Sequelize 迁移以使用来自导入函数的响应更新字段?

javascript - 在循环使用 Mongoose 查询时有希望 - Node Bluebird

Node.js express : why can't I read cookies ?

asynchronous - 尝试使用 async.concat 从 redis 检索数据时出错

.net - 处理数千个连接的最佳方式

javascript - 使用 Sequelize 时,我是否必须遵循他们的表/字段名称模式?

node.js - NodeJs : Sequelize (Version - 5+) N:M association is not working