【发布时间】:2021-11-12 23:23:54
【问题描述】:
所以,我有一个查询返回一些用户的报告,代码是:
const reports = await database.query(
'SELECT r.id, r.type, r.fileCid, r.madeById, r.reportedId, u1.username as reportedName, u2.username as madeBy \
FROM reports r \
left join users u1 on u1.id = r.reportedId \
inner join users u2 on u2.id = r.madeById '
);
return reports;
如果我直接在我的数据库上运行它,它会返回这个示例数据:
+----+------+------------------------------------------------+----------+------------+--------------+--------+
| id | type | fileCid | madeById | reportedId | reportedName | madeBy |
+----+------+------------------------------------------------+----------+------------+--------------+--------+
| 5 | 1 | cidF | 4 | NULL | NULL | username |
| 6 | 0 | cidF | 4 | NULL | NULL | username |
+----+------+------------------------------------------------+----------+------------+--------------+--------+
所以我作为对象的预期结果是:
[{
"id": 5,
"type": 1,
"fileCid": "cidF",
"madeById": 4,
"reportedId": null,
"reportedName": null,
"madeBy": "ftk"
}, {
"id": 6,
"type": 0,
"fileCid": "cidF",
"madeById": 4,
"reportedId": null,
"reportedName": null,
"madeBy": "ftk"
}]
但它确实返回了一个重复数据的数组:
[
[{
"id": 5,
"type": 1,
"fileCid": "cidF",
"madeById": 4,
"reportedId": null,
"reportedName": null,
"madeBy": "ftk"
}, {
"id": 6,
"type": 0,
"fileCid": "cidF",
"madeById": 4,
"reportedId": null,
"reportedName": null,
"madeBy": "ftk"
}],
[{
"id": 5,
"type": 1,
"fileCid": "cidF",
"madeById": 4,
"reportedId": null,
"reportedName": null,
"madeBy": "ftk"
}, {
"id": 6,
"type": 0,
"fileCid": "cidF",
"madeById": 4,
"reportedId": null,
"reportedName": null,
"madeBy": "ftk"
}]
]
为什么会这样?这显然是 sequelize 的一个问题,因为如果我直接在 MySql 上运行它,只会按预期返回 2 个寄存器......另外,不是重复的问题from this one,尽管它可能看起来
编辑 这就是报告表格的定义方式。我只是在猜测,因为我对同一个表使用了两个外键,所以可能 sequelize 会产生这个错误:
const Report = database.define('report', {
id: {
type: Sequelize.INTEGER,
autoIncrement: true,
allowNull: false,
primaryKey: true
},
type: {
type: Sequelize.INTEGER,
allowNull: false
}
},
{
updatedAt: false
}
)
Report.belongsTo(User, {as: 'madeBy'});
Report.belongsTo(User, {as: 'reported'});
Report.belongsTo(File);
【问题讨论】:
-
您确定上面粘贴的代码与正在运行的代码相同吗?尝试更改查询中的某些内容,例如从 SELECT 列表中删除一列。
-
是的,它是相同的代码。我在开发中使用
nodemon。我也做了你推荐的测试,错误仍然存在。 -
如果在
.query函数中添加{ type: QueryTypes.SELECT }作为第二个参数会怎样?
标签: javascript node.js sequelize.js