1 00:00:01,220 --> 00:00:03,030 Let's now improve the nested 2 00:00:03,030 --> 00:00:06,620 route implementation that we coded in the last lecture. 3 00:00:06,620 --> 00:00:07,500 And for that, 4 00:00:07,500 --> 00:00:11,213 we're gonna use a special advanced express feature. 5 00:00:12,840 --> 00:00:15,070 So, as you remember, in the last video 6 00:00:15,070 --> 00:00:18,920 we implemented a simple nested post route, 7 00:00:18,920 --> 00:00:21,860 so just this one here. 8 00:00:21,860 --> 00:00:25,240 Right. And so this means that the review route 9 00:00:25,240 --> 00:00:27,590 is kind of within the tour route. 10 00:00:27,590 --> 00:00:32,130 And again, because reviews belong to tours in a sense. 11 00:00:32,130 --> 00:00:32,963 Right? 12 00:00:32,963 --> 00:00:36,920 And so this is a very common thing to do in Api design. 13 00:00:36,920 --> 00:00:39,950 Now, the problem with this implementation is that it is, 14 00:00:39,950 --> 00:00:41,800 of course, a bit messy. 15 00:00:41,800 --> 00:00:45,420 And that is because we put a route for creating a review 16 00:00:45,420 --> 00:00:47,090 in the tour router. 17 00:00:47,090 --> 00:00:50,430 Simply because a route starts with slash tour. 18 00:00:50,430 --> 00:00:51,950 So that's a bit confusing, 19 00:00:51,950 --> 00:00:53,500 and what's also confusing 20 00:00:53,500 --> 00:00:56,480 is that we have something very similar to this here, 21 00:00:56,480 --> 00:00:59,160 also in our review route. 22 00:00:59,160 --> 00:01:01,203 So, basically this here. 23 00:01:01,203 --> 00:01:04,840 So when we create a new review without the nested route, 24 00:01:04,840 --> 00:01:08,450 this piece of the code here is actually exactly the same 25 00:01:08,450 --> 00:01:10,600 as this one. Right? 26 00:01:10,600 --> 00:01:12,940 And so, besides this being a bit confusing, 27 00:01:12,940 --> 00:01:16,020 we also have duplicate code which we would have to maintain 28 00:01:16,020 --> 00:01:19,910 in two separate places in case we wanted to change anything. 29 00:01:19,910 --> 00:01:23,120 And so again, that's a very bad practice. 30 00:01:23,120 --> 00:01:26,600 And so let's now fix this using an advanced express feature 31 00:01:26,600 --> 00:01:28,410 called mergeParams. 32 00:01:28,410 --> 00:01:31,270 So first off let's remove this code here 33 00:01:31,270 --> 00:01:34,690 which doesn't really belong to the tour router. 34 00:01:34,690 --> 00:01:38,500 Next up, we will actually import the review router 35 00:01:38,500 --> 00:01:40,840 into this tour router. 36 00:01:40,840 --> 00:01:41,740 Okay? 37 00:01:41,740 --> 00:01:44,460 So right now we are importing the review controller, 38 00:01:44,460 --> 00:01:47,330 but actually we want the review router. 39 00:01:47,330 --> 00:01:49,220 So let's get rid of this one, 40 00:01:49,220 --> 00:01:51,963 and actually I'm going to delete it altogether. 41 00:01:53,090 --> 00:01:53,923 And now, 42 00:01:54,960 --> 00:01:55,880 the review 43 00:01:57,070 --> 00:01:57,923 router. 44 00:02:05,500 --> 00:02:06,333 And okay. 45 00:02:07,410 --> 00:02:12,100 So, let's actually get this code 46 00:02:12,100 --> 00:02:13,480 and put it here at the top, 47 00:02:13,480 --> 00:02:15,903 just so that we see what we're doing, 48 00:02:17,140 --> 00:02:19,730 because we will actually create some new code 49 00:02:19,730 --> 00:02:21,620 right here at the top. 50 00:02:21,620 --> 00:02:23,560 And so what we're gonna do here 51 00:02:23,560 --> 00:02:24,393 is to say 52 00:02:26,781 --> 00:02:29,270 router.use. 53 00:02:29,270 --> 00:02:32,060 And so we will basically say that this tour router 54 00:02:32,060 --> 00:02:33,890 should use the review router 55 00:02:33,890 --> 00:02:37,373 in case it ever encounters a route like this. 56 00:02:43,070 --> 00:02:43,903 And 57 00:02:46,440 --> 00:02:48,670 Review routes. 58 00:02:48,670 --> 00:02:50,600 Did I call it routes or router? 59 00:02:50,600 --> 00:02:52,083 Should be called router. 60 00:02:53,630 --> 00:02:54,463 Okay? 61 00:02:55,690 --> 00:02:58,010 So, keep in mind that a router itself 62 00:02:58,010 --> 00:02:59,730 is really just a middleware. 63 00:02:59,730 --> 00:03:02,580 And so we can use the use method on it, 64 00:03:02,580 --> 00:03:05,200 and then say that for this specific route here, 65 00:03:05,200 --> 00:03:08,210 we want to use the review router instead. 66 00:03:08,210 --> 00:03:09,043 Okay? 67 00:03:09,043 --> 00:03:11,890 And so this is actually again mounting a router. 68 00:03:11,890 --> 00:03:14,300 So, if you take a look at that, 69 00:03:14,300 --> 00:03:15,870 here in the app.js, 70 00:03:15,870 --> 00:03:18,140 that's actually exactly what we did. 71 00:03:18,140 --> 00:03:20,410 So we did .use, 72 00:03:20,410 --> 00:03:22,090 then the URL, 73 00:03:22,090 --> 00:03:23,430 and then the router. 74 00:03:23,430 --> 00:03:25,040 And so here, what we're doing 75 00:03:25,040 --> 00:03:27,340 is actually the exact same thing. 76 00:03:27,340 --> 00:03:30,360 So this is the tour router, and so then we say 77 00:03:30,360 --> 00:03:33,250 well whenever you find a URL like this, 78 00:03:33,250 --> 00:03:36,010 well, then just use the review router. 79 00:03:36,010 --> 00:03:40,010 And so, right now, when we have a URL like this, 80 00:03:40,010 --> 00:03:44,700 it will start by getting into the tour router here, 81 00:03:44,700 --> 00:03:47,963 okay, because, again it starts with slash tours, 82 00:03:48,920 --> 00:03:49,753 okay, 83 00:03:49,753 --> 00:03:52,920 so basically it's rerouted into the tour router, 84 00:03:52,920 --> 00:03:55,400 then when it reaches the tour router, 85 00:03:55,400 --> 00:03:57,800 then it will match this URL here, 86 00:03:57,800 --> 00:04:02,370 and then it will again be rerouted into the review router. 87 00:04:02,370 --> 00:04:04,300 And like this, we have the tour router 88 00:04:04,300 --> 00:04:06,780 and the review router nicely separated 89 00:04:06,780 --> 00:04:09,300 and decoupled from one another. 90 00:04:09,300 --> 00:04:12,370 But now, there's actually still one piece missing 91 00:04:12,370 --> 00:04:15,170 because right now this review router here 92 00:04:15,170 --> 00:04:19,410 doesn't get access to this tour id parameter, okay. 93 00:04:19,410 --> 00:04:22,050 And so now we need to enable the review router 94 00:04:22,050 --> 00:04:26,200 to actually get access to this parameter here as well. 95 00:04:26,200 --> 00:04:29,980 So let's now move to the review router, okay. 96 00:04:29,980 --> 00:04:32,180 And so this is where the medical mergeParams 97 00:04:33,264 --> 00:04:34,810 that I mentioned right in the beginning 98 00:04:34,810 --> 00:04:35,943 comes into play. 99 00:04:38,030 --> 00:04:40,790 So here, in the express.router function, 100 00:04:40,790 --> 00:04:43,010 we can specify some options, 101 00:04:43,010 --> 00:04:45,760 and here all we need to do is set mergeParams 102 00:04:48,160 --> 00:04:49,170 to true. 103 00:04:49,170 --> 00:04:50,440 And that's it. 104 00:04:50,440 --> 00:04:53,750 But why do we actually need this here? 105 00:04:53,750 --> 00:04:55,780 Well, it's because, by default, 106 00:04:55,780 --> 00:04:57,850 each router only have access 107 00:04:57,850 --> 00:05:01,780 to the parameters of their specific routes, right. 108 00:05:01,780 --> 00:05:06,720 But here, in this route, so in this URL for this post, 109 00:05:06,720 --> 00:05:09,930 there's of course actually no tour id. 110 00:05:09,930 --> 00:05:12,630 But, we still want to get access to the tour id 111 00:05:12,630 --> 00:05:16,050 that was in this other router, right. 112 00:05:16,050 --> 00:05:17,430 So this here. 113 00:05:17,430 --> 00:05:20,420 And so, in order to get access to that parameter 114 00:05:20,420 --> 00:05:21,910 in this other router, 115 00:05:21,910 --> 00:05:25,570 we need to physically merge the parameters, okay. 116 00:05:25,570 --> 00:05:29,270 And so that's what mergeParams, set to true, does. 117 00:05:29,270 --> 00:05:32,663 And so now, no matter if we get a route like this, 118 00:05:34,310 --> 00:05:36,853 so let's just copy it here, 119 00:05:38,270 --> 00:05:41,383 Again it's easier to visualize it with an example. 120 00:05:42,280 --> 00:05:45,647 And so again, no matter if we get a route like this, 121 00:05:48,380 --> 00:05:49,840 or a route like this, 122 00:05:49,840 --> 00:05:54,530 it will now all end up in this handler here, okay. 123 00:05:54,530 --> 00:05:58,130 So in the end basically to this handler function. 124 00:05:58,130 --> 00:06:01,060 And again that works because all of the routes 125 00:06:01,060 --> 00:06:03,710 starting with this kind of pattern here 126 00:06:03,710 --> 00:06:06,720 will be redirected to this router 127 00:06:06,720 --> 00:06:09,960 exactly in this line of code here, okay. 128 00:06:09,960 --> 00:06:13,220 So we redirected to the review router here 129 00:06:13,220 --> 00:06:17,600 and so then in there it will match to this exact route, 130 00:06:17,600 --> 00:06:18,433 okay. 131 00:06:18,433 --> 00:06:19,990 And thanks to merge parameters, 132 00:06:19,990 --> 00:06:22,310 we then get access to this id 133 00:06:22,310 --> 00:06:25,700 which actually comes from the other router before. 134 00:06:25,700 --> 00:06:26,940 Great. 135 00:06:26,940 --> 00:06:28,843 So let's just do some clean up here, 136 00:06:29,870 --> 00:06:31,323 actually get rid of this, 137 00:06:32,260 --> 00:06:33,143 this here, 138 00:06:34,230 --> 00:06:35,063 and 139 00:06:36,310 --> 00:06:38,560 let's quickly try it out now. 140 00:06:38,560 --> 00:06:40,940 So I'm gonna create a new review here 141 00:06:42,100 --> 00:06:44,143 and let's try another tool this time. 142 00:06:47,180 --> 00:06:48,533 So the city wanderer. 143 00:06:51,160 --> 00:06:52,990 And all we need to do is to change 144 00:06:52,990 --> 00:06:57,030 that id right here in the URL, right. 145 00:06:57,030 --> 00:07:00,250 So, the rating is gonna be three, 146 00:07:00,250 --> 00:07:01,083 and then 147 00:07:03,570 --> 00:07:07,190 was kinda okay. 148 00:07:07,190 --> 00:07:10,943 All right, and so this review will still be done with Jonas, 149 00:07:11,960 --> 00:07:14,940 so from this account, okay, 150 00:07:14,940 --> 00:07:16,300 because that's still one 151 00:07:16,300 --> 00:07:20,890 that is logged in at this current moment, okay. 152 00:07:20,890 --> 00:07:21,963 So, let's send that, 153 00:07:23,160 --> 00:07:26,900 and indeed here we get the tour that we just specified, 154 00:07:26,900 --> 00:07:28,383 and still the same user. 155 00:07:30,110 --> 00:07:34,710 So that's again just to make sure check the tour 156 00:07:34,710 --> 00:07:37,110 to see if it now gets this review 157 00:07:37,110 --> 00:07:39,500 and yeah, it did. 158 00:07:39,500 --> 00:07:42,710 And so that merge parameter trick, that we just implemented, 159 00:07:42,710 --> 00:07:44,650 actually works just fine, 160 00:07:44,650 --> 00:07:46,280 and as intended. 161 00:07:46,280 --> 00:07:48,790 Now to see this in action, even better, 162 00:07:48,790 --> 00:07:50,560 we're gonna adapt the henry function 163 00:07:50,560 --> 00:07:53,420 for getting all the reviews for a specific tour 164 00:07:53,420 --> 00:07:54,793 right in the next video.