我正在尝试构建一个留言板来自学JavaScript。我正在使用:
我有一个视图/board
,它使用以下路由(以及相应的sqlize查询)来获取显示“board index”的数据:
router.get('/api/board/fetch', function(req, res) {
if(req.session.key) {
dbconn.threads.findAll({
order: 'id DESC',
include: [{
model: dbconn.users,
attributes: ['id', 'username', 'first_name']
}]
}).then(function(threads) {
return res.send({ success: true, threads: threads }); // return all threads found in table
});
} else {
return res.send({ success: false, msg: 'Error: Posts' })
}
});
上面的示例只是使用一些关联的模型数据获取线程以显示摘要索引。现在,为了也显示特定线程中的当前“帖子计数”,我将sqlize修改为:
router.get('/api/board/fetch', function(req, res) {
if(req.session.key) {
dbconn.threads.findAll({
order: 'threads.id DESC',
group: ['threads.id', 'replies.id'],
raw: true,
include: [{
model: dbconn.users,
attributes: ['id', 'username', 'first_name'],
}, {
model: dbconn.replies,
attributes: [[sequelize.fn('COUNT', 'id'), 'replyCount']],
}]
}).then(function(threads) {
return res.send({ success: true, threads: threads }); // return all threads found in table
});
} else {
return res.send({ success: false, msg: 'Error: Posts' })
}
});
我使用this SO question和this GH issue将它拼凑在一起,而不是输出:
主题标题| #回复
它列出相同的数据5次,所有这些数据的“#Reslies”为0。我相信正在发生的事情:
replies.id
='x'threadId
为了更好的背景(希望如此),我的控制器中有以下内容:
board.fetch().then(function(data) {
$scope.thread = data
console.log("data obj -> ", data)
})
使用我的service.js中的以下内容:
fetch : function() {
return $http.get('/api/board/fetch').then(function(response) {
return response.data
})
},
在浏览器中,对象可以理解地在threads
数组中有五个对象,它们都包含相同的数据(从sqlize查询中有意义)和replies.replyCount: 1
。
我为可怕的代码,命名约定道歉,如果在其他地方得到解答的话。我今天花了一些时间试图解决这个问题,但由于我缺乏理解来寻找正确的问题,因此我受到了限制。
如果有必要,我可以提供模型定义;这个帖子已经感觉很久了。
更新 根据{{3}}的观察修改了代码,它现在可以正常工作。更新了以下代码:
dbconn.threads.findAll({
order: 'threads.id DESC',
raw: true,
attributes: {
include: ['title', 'body', 'slug', 'createdAt', 'userId', [sequelize.fn('COUNT', 'replies.id'), 'replyCount']]
},
include: [{
model: dbconn.users,
}, {
model: dbconn.replies, attributes: [],
}],
group: ['threads.id', 'replies.threadId'],
}).then(function(threads) {
return res.send({ success: true, threads: threads }); // return all threads found in table
});
} else {
return res.send({ success: false, msg: 'Error: Posts' })
}