The advantage of using promises is you can chain them, so your code can be reduced to:
let post, comments;
Posts.findOne({id: id}).exec().then(_post => {
post = _post;
return Comments.find({id: post.id}).exec();
}).then(_comments => {
comments = _comments;
return Links.find({id: post.id}).exec();
}).then(links => res.json({post, comment, links}))
.catch(error => res.error(error.message));
you would notice that I needed only a single catch block.