node的mysql一个问题,关于数据绑定问题
发布于 10 年前 作者 hinson0 5698 次预览 最后一次回复是 10 年前 来自 问答
表 post id content user_id
表 comment id content post_id
前端工程师想要的数据格式:
[
{
"id": "帖子id,整型",
"content": "帖子内容,字符串",
"comments": [
{
"id": "评论ID,整型",
"content": "评论内容,整型",
"post_id": "所属帖子ID,整型",
},
...
]
}
]
node的代码我是这么写的:假设去用户ID=1的帖子
// 上面省略代码...
function Post() {
}
// 获取帖子
Post.getListByUserId = function(userId, callback) {
var query = db.query('SELECT * FROM post WHERE user_id = ?', userId, function(err, posts) {
// 出错
if (err) {
console.log(err);
return;
}
// 遍历帖子 -> 下面的代码是有问题的代码,第一次用Node,按照PHP那种同步的思想来做了,不知道怎么得到前端工程师想要的这样的数据结构????
// 问题1:db.query 是异步的,所以我不知道如何收集结果集
posts.forEach(function(post) {
db.query('SELECT * FROM comment WHERE post_id = ?', post.id, function(err, comments) {
post.comments = comments;
});
});
return callback(posts);
});
}
14 回复
在线等
使用left join即可
@i5ting left join的数据结构是平行的。
你有没有打印出来看一看啊。你这么写没什么问题。唯一我觉得有点毛病的是db.query是异步的,post.comments = comments;还没执行就已经return callback(posts);了。。你先打印一下看看你的结果。如果posts部分是空,function(err, comments,callback(posts){ })这样子嵌套一下去做。
对了,callback最好一层层往下传,尽量不要闭包用。。。
用sql关联 left join 然后将结果稍微改成前端需要的格式即可
异步的函数返回的数据需要聚合,去看看 eventproxy 这个库
你这种数据格式本来用mongo最合适,不过mysql也可以办到,就是写两个查询,msyql属性可以设置multipleStatements: true, 代表可以执行两个查询语句,之所以这样是因为left join也无法得到这种带数组的数据结构,至少我还不知道,所以你可以拿到查询的结果rows[0],rows[1],然后拼接为这种数据结构
async欢迎你
Promise.All 貌似可以
在查询callback中递归调用
简单到一了,这种查询不要请求太多,任何一次额外的请求响应都是增加延迟。
[1.] 如果请求的数据量不是超级大(客观上允许响应数据冗余),可以放在一个查询,然后把结果做一次手工聚合
[2.] 如果数据很大,应该也只分成两个查询,再回来聚合
万恶的输入框,删除不掉。。 f $er
感觉4楼也对,看来异步改变不止是体验,还有代码执行顺序问题啊。如此,所,此处return,需要基,事件驱动? 万恶的输入框,真删除不掉啊。。。