将承诺转换成可观察的结果以复制数组

时间:2019-01-29 09:54:17

标签: rxjs sequelize.js

我有以下代码,假设某些带有User的Sequelize模型findQuery旨在向我返回一行:

import { from } from 'rxjs';
import sequelize from './database.js'; // Database connection

let sql = "SELECT * FROM users WHERE id = $1";

let searchUser = sequelize.query(sql);
let searchUser$ = from(searchUser);

searchUser$.subscribe(console.log);

我希望它能给我一个Observable<Array>,它发出一个包含结果的单个数组。

问题

它向我发出一个数组,其中包含两个数组,包含相同的值:

[
   [ {id: "someid", name: "John", age: 12} ],
   [ {id: "someid", name: "John", age: 12} ]
]

期望值

[ {id: "someid", name: "John", age: 12} ]

如何解决sequelize的用法,使其仅返回一组结果?如何避免重复的结果?

1 个答案:

答案 0 :(得分:1)

出现重复结果的原因是因为Sequelize returns both the results of your SQL query and the metadata results。在某些情况下,您使用的SQL引擎也会返回结果作为元数据。

您要做的是防止Sequelize向您返回元数据。

同步模型使用参考

  

在不需要访问元数据的情况下,可以传递查询类型以告诉序列化如何格式化结果。例如,对于简单的选择查询,您可以执行以下操作:

sequelize.query("SELECT * FROM `users`", { type: sequelize.QueryTypes.SELECT})
  .then(users => {
    // We don't need spread here, since only 
    // the results will be returned for select queries
  })

TL; DR如何防止Sequelize返回元数据?

除了在查询选项中传递可能要绑定的任何参数外,还将类型说明符添加到查询选项中:

import { from } from 'rxjs';
import sequelize from './database.js'; // Database connection

let sql = "SELECT * FROM users WHERE id = $1";

let queryOptions = { 
    bind: [],
    type: sequelize.QueryTypes.SELECT
}

let searchUser = sequelize.query(sql, queryOptions);
let searchUser$ = from(searchUser);

searchUser$.subscribe(console.log);