﻿1
00:00:01,140 --> 00:00:02,070
‫So in this lecture,

2
00:00:02,070 --> 00:00:03,570
‫you're gonna learn an easy way

3
00:00:03,570 --> 00:00:06,810
‫of defining parameters right in the URL,

4
00:00:06,810 --> 00:00:08,940
‫how to then read these parameters,

5
00:00:08,940 --> 00:00:11,323
‫and also, how to respond to them.

6
00:00:12,930 --> 00:00:16,230
‫Now, what we want to actually implement in this lecture

7
00:00:16,230 --> 00:00:19,260
‫is a way of getting only one tour.

8
00:00:19,260 --> 00:00:21,430
‫So right now, we have this endpoint here,

9
00:00:21,430 --> 00:00:23,060
‫which gives us all the tours,

10
00:00:23,060 --> 00:00:25,500
‫and we want to have something like this.

11
00:00:25,500 --> 00:00:28,710
‫So let's copy it into a new request for now,

12
00:00:28,710 --> 00:00:31,930
‫and then, we want slash, and then the ID of the tour.

13
00:00:31,930 --> 00:00:34,610
‫So for example, let's say five, okay?

14
00:00:34,610 --> 00:00:36,770
‫So, this is just like we talked about

15
00:00:36,770 --> 00:00:39,120
‫in the REST API lecture,

16
00:00:39,120 --> 00:00:44,120
‫where I said that if we hit this endpoint without any ID,

17
00:00:44,420 --> 00:00:46,350
‫so just like this here,

18
00:00:46,350 --> 00:00:48,490
‫well, then we would get all the tours.

19
00:00:48,490 --> 00:00:51,550
‫But if we would specify an ID after that,

20
00:00:51,550 --> 00:00:53,210
‫so, just like this,

21
00:00:53,210 --> 00:00:55,250
‫and of course it doesn't have to be an ID,

22
00:00:55,250 --> 00:00:57,600
‫it can be any unique identifier,

23
00:00:57,600 --> 00:01:00,080
‫but in this case, the easiest way of implementing it

24
00:01:00,080 --> 00:01:02,230
‫is to just use IDs, okay?

25
00:01:02,230 --> 00:01:05,350
‫So, this here is of course a variable,

26
00:01:05,350 --> 00:01:09,050
‫because it can be five, but it can also be anything else.

27
00:01:09,050 --> 00:01:11,700
‫And so this piece of the URL here,

28
00:01:11,700 --> 00:01:15,140
‫so this here, this is a variable, okay?

29
00:01:15,140 --> 00:01:16,390
‫And so what we need to do

30
00:01:16,390 --> 00:01:19,983
‫is to define a route which can accept a variable.

31
00:01:20,870 --> 00:01:23,600
‫All right, and so let's do that here,

32
00:01:23,600 --> 00:01:25,633
‫and actually right after this one.

33
00:01:26,740 --> 00:01:29,200
‫And I'm just gonna go ahead and copy it,

34
00:01:29,200 --> 00:01:32,143
‫because you already know how to write it at this point.

35
00:01:33,920 --> 00:01:35,360
‫And so, yeah.

36
00:01:35,360 --> 00:01:36,793
‫So here we have the route,

37
00:01:37,860 --> 00:01:41,410
‫and so now all we need to do is to add that variable.

38
00:01:41,410 --> 00:01:42,600
‫And that's very easy.

39
00:01:42,600 --> 00:01:45,370
‫So we have our slash again, and then the variable,

40
00:01:45,370 --> 00:01:48,580
‫we define it using a colon, like this.

41
00:01:48,580 --> 00:01:51,910
‫And so like this, we created a variable called ID.

42
00:01:51,910 --> 00:01:54,090
‫It could of course be anything else,

43
00:01:54,090 --> 00:01:56,280
‫like var, or X.

44
00:01:56,280 --> 00:01:57,510
‫Doesn't really matter.

45
00:01:57,510 --> 00:02:01,130
‫But this one is called ID, all right?

46
00:02:01,130 --> 00:02:03,653
‫Now we don't want to send back anything like this,

47
00:02:04,490 --> 00:02:06,500
‫so let's just comment it out.

48
00:02:06,500 --> 00:02:08,280
‫And what I want you to take a look at

49
00:02:08,280 --> 00:02:10,003
‫is at console dot log,

50
00:02:11,870 --> 00:02:14,170
‫req dot params.

51
00:02:14,170 --> 00:02:18,390
‫Okay, so request dot params is where all the parameters

52
00:02:18,390 --> 00:02:22,240
‫of all the variables that we define here are stored, okay?

53
00:02:22,240 --> 00:02:26,190
‫So these variables here in the URL are called parameters,

54
00:02:26,190 --> 00:02:28,960
‫and again, they are in req dot params,

55
00:02:28,960 --> 00:02:31,400
‫available for us to use now.

56
00:02:31,400 --> 00:02:33,020
‫So let's take a look now

57
00:02:33,020 --> 00:02:34,540
‫and actually do this request.

58
00:02:34,540 --> 00:02:36,410
‫And for now, it's not gonna do anything,

59
00:02:36,410 --> 00:02:38,640
‫so it will not give us tour number five

60
00:02:38,640 --> 00:02:40,490
‫automatically, of course.

61
00:02:40,490 --> 00:02:41,820
‫But what I want to do for now

62
00:02:41,820 --> 00:02:44,170
‫is to just take a look at req dot params.

63
00:02:44,170 --> 00:02:47,690
‫And so indeed, here we have, ID is five.

64
00:02:47,690 --> 00:02:50,480
‫So, request dot params is a very nice object

65
00:02:50,480 --> 00:02:53,160
‫which automatically assigns the value

66
00:02:53,160 --> 00:02:57,600
‫to our variable, so our parameter that we defined.

67
00:02:57,600 --> 00:02:59,720
‫And we could actually define multiple.

68
00:02:59,720 --> 00:03:01,703
‫So we could say ID,

69
00:03:01,703 --> 00:03:04,883
‫and then we could say X, and we could say Y,

70
00:03:06,360 --> 00:03:10,110
‫and then we, of course, would have to define all of them.

71
00:03:10,110 --> 00:03:11,750
‫So 23

72
00:03:11,750 --> 00:03:14,200
‫and 45, let's say.

73
00:03:14,200 --> 00:03:15,810
‫Send this guy.

74
00:03:15,810 --> 00:03:17,380
‫And then, indeed, we have an object

75
00:03:17,380 --> 00:03:20,290
‫with all these three variables in them.

76
00:03:20,290 --> 00:03:23,680
‫Okay, now if we define them like this in the URL,

77
00:03:23,680 --> 00:03:26,003
‫we actually have to then specify.

78
00:03:26,890 --> 00:03:29,060
‫So if we didn't have the Y parameter,

79
00:03:29,060 --> 00:03:31,180
‫we would run into an error,

80
00:03:31,180 --> 00:03:35,350
‫because we are now not hitting this exact route, okay?

81
00:03:35,350 --> 00:03:38,900
‫So our route is now no longer exactly this,

82
00:03:38,900 --> 00:03:40,730
‫but it's only this.

83
00:03:40,730 --> 00:03:43,500
‫And so, there is an error, okay?

84
00:03:43,500 --> 00:03:44,650
‫Make sense?

85
00:03:44,650 --> 00:03:46,950
‫Now there is actually one thing that we can do,

86
00:03:46,950 --> 00:03:48,980
‫and that is optional parameters.

87
00:03:48,980 --> 00:03:51,790
‫So if you want to make this parameter optional,

88
00:03:51,790 --> 00:03:53,880
‫we just add a question mark to it,

89
00:03:53,880 --> 00:03:57,283
‫and now, it is optional, so we no longer have to specify it.

90
00:03:58,410 --> 00:03:59,860
‫So just like this.

91
00:03:59,860 --> 00:04:02,970
‫And so now we only have five, 23,

92
00:04:02,970 --> 00:04:05,660
‫and then Y is still here, but it's undefined,

93
00:04:05,660 --> 00:04:06,960
‫because it's now optional.

94
00:04:07,940 --> 00:04:08,773
‫All right.

95
00:04:08,773 --> 00:04:11,610
‫But let's get rid of all of this,

96
00:04:11,610 --> 00:04:15,430
‫because we only really need the ID, okay?

97
00:04:15,430 --> 00:04:16,830
‫And so now all we need to do

98
00:04:16,830 --> 00:04:19,920
‫is to actually get the tour with this ID

99
00:04:19,920 --> 00:04:23,720
‫from our data.json, from our JSON file, right?

100
00:04:23,720 --> 00:04:25,580
‫So basically, from the tours array.

101
00:04:25,580 --> 00:04:28,100
‫And so that shouldn't be all too hard.

102
00:04:28,100 --> 00:04:29,493
‫And so let's say,

103
00:04:33,110 --> 00:04:35,400
‫const tour is equals

104
00:04:35,400 --> 00:04:37,140
‫to tours

105
00:04:38,320 --> 00:04:39,500
‫dot find.

106
00:04:39,500 --> 00:04:41,610
‫And I'm not sure if you are familiar

107
00:04:41,610 --> 00:04:43,350
‫with this find method here.

108
00:04:43,350 --> 00:04:46,400
‫So once, more this has nothing to do Node or Express,

109
00:04:46,400 --> 00:04:48,750
‫it's just a regular JavaScript function

110
00:04:48,750 --> 00:04:50,610
‫which you can use on arrays.

111
00:04:50,610 --> 00:04:52,270
‫And the way it works is this.

112
00:04:52,270 --> 00:04:55,160
‫So in here, we pass a callback function,

113
00:04:55,160 --> 00:04:57,993
‫and so let me actually start by writing that one out.

114
00:04:59,590 --> 00:05:01,310
‫So element ID

115
00:05:01,310 --> 00:05:03,260
‫equals the req

116
00:05:04,410 --> 00:05:06,130
‫dot params, okay?

117
00:05:06,130 --> 00:05:08,660
‫So it'll basically loop through the array,

118
00:05:08,660 --> 00:05:10,320
‫and in each of the iterations,

119
00:05:10,320 --> 00:05:12,950
‫we will have access to the current element,

120
00:05:12,950 --> 00:05:15,060
‫and we will return either true or false

121
00:05:15,060 --> 00:05:17,700
‫in each of the iterations, okay?

122
00:05:17,700 --> 00:05:20,050
‫Now what the find method will then do

123
00:05:20,050 --> 00:05:21,890
‫is that basically, it will create an array

124
00:05:21,890 --> 00:05:23,520
‫which only contains the element

125
00:05:23,520 --> 00:05:27,620
‫where this comparison here turns out to be true, all right?

126
00:05:27,620 --> 00:05:29,840
‫And in this situation, we want to find the element

127
00:05:29,840 --> 00:05:32,020
‫where the ID is equal to the one

128
00:05:32,020 --> 00:05:33,860
‫that we get from the parameters.

129
00:05:33,860 --> 00:05:36,830
‫And so by specifying this callback function here

130
00:05:36,830 --> 00:05:39,520
‫with this comparison, we will ensure

131
00:05:39,520 --> 00:05:42,630
‫that only the element where the ID is actually equal

132
00:05:42,630 --> 00:05:45,160
‫to the specified ID in the parameters

133
00:05:45,160 --> 00:05:47,600
‫will get returned from the find method

134
00:05:47,600 --> 00:05:50,520
‫and stored into tour, all right?

135
00:05:50,520 --> 00:05:54,070
‫Now actually, this is not going to work like this,

136
00:05:54,070 --> 00:05:55,620
‫because as you see down here,

137
00:05:55,620 --> 00:05:58,460
‫these values here, they are actually strings, okay?

138
00:05:58,460 --> 00:06:01,090
‫So we need to convert that to a number,

139
00:06:01,090 --> 00:06:02,290
‫but that's very easy.

140
00:06:02,290 --> 00:06:04,310
‫All we have to do is to say,

141
00:06:04,310 --> 00:06:08,380
‫the ID is equal to req dot params

142
00:06:09,330 --> 00:06:12,200
‫dot ID times one.

143
00:06:12,200 --> 00:06:14,210
‫So this is a nice trick where JavaScript,

144
00:06:14,210 --> 00:06:17,690
‫when we multiply a string that looks like a number,

145
00:06:17,690 --> 00:06:19,870
‫when we multiply that with another number,

146
00:06:19,870 --> 00:06:22,983
‫it will then automatically convert that string to a number.

147
00:06:23,860 --> 00:06:27,903
‫So that's a very small, nice trick that we can use here.

148
00:06:29,910 --> 00:06:34,910
‫And so, now, we already have our tour ready to send.

149
00:06:36,410 --> 00:06:39,320
‫And so the data that we want to send

150
00:06:39,320 --> 00:06:41,410
‫is tours equal

151
00:06:41,410 --> 00:06:43,463
‫to tour.

152
00:06:44,450 --> 00:06:45,770
‫Or actually, it's just tour,

153
00:06:45,770 --> 00:06:48,440
‫so tour should be equal to tour, all right?

154
00:06:48,440 --> 00:06:49,570
‫Make sense?

155
00:06:49,570 --> 00:06:53,050
‫So maybe the most complicated part here is just this one,

156
00:06:53,050 --> 00:06:56,900
‫but, yeah, that is again just a normal JavaScript.

157
00:06:56,900 --> 00:06:59,520
‫And so I believe, or at least I hope,

158
00:06:59,520 --> 00:07:01,710
‫that you're already familiar with using

159
00:07:01,710 --> 00:07:04,943
‫this kind of array methods, all right?

160
00:07:06,250 --> 00:07:09,720
‫So, we only want tour number five.

161
00:07:09,720 --> 00:07:12,590
‫And so let's take a look if it actually works.

162
00:07:12,590 --> 00:07:15,860
‫And well, it didn't, so let's take a look at that.

163
00:07:15,860 --> 00:07:20,250
‫Oh yeah, indeed, here we need to use the ID, of course.

164
00:07:20,250 --> 00:07:22,130
‫So not req.params.

165
00:07:22,130 --> 00:07:23,440
‫ID.

166
00:07:23,440 --> 00:07:26,570
‫Okay, so, try that again.

167
00:07:26,570 --> 00:07:30,970
‫And now, indeed, we have the tour with ID of five,

168
00:07:30,970 --> 00:07:33,193
‫okay, and only that single tour.

169
00:07:35,230 --> 00:07:37,390
‫Let's try number two, for example,

170
00:07:37,390 --> 00:07:39,800
‫and indeed, ID two.

171
00:07:39,800 --> 00:07:41,800
‫But now, let's try another situation.

172
00:07:41,800 --> 00:07:44,723
‫Let's do, ID 23,

173
00:07:45,730 --> 00:07:48,490
‫and so now, we get nothing back, right?

174
00:07:48,490 --> 00:07:53,050
‫And that's because there is no tour with the ID of 23,

175
00:07:53,050 --> 00:07:56,300
‫but we still return the 200 OK status code,

176
00:07:56,300 --> 00:07:59,330
‫and so, that doesn't make much sense, okay?

177
00:07:59,330 --> 00:08:01,903
‫And so let's actually go ahead and change that.

178
00:08:02,830 --> 00:08:04,580
‫And what should we do here?

179
00:08:04,580 --> 00:08:07,180
‫Well, as a very simplistic solution,

180
00:08:07,180 --> 00:08:09,990
‫what we can do is to check if the ID

181
00:08:09,990 --> 00:08:13,420
‫is larger than the length of the tours array,

182
00:08:13,420 --> 00:08:15,030
‫and if it is longer, well,

183
00:08:15,030 --> 00:08:17,670
‫then we can send back a 404 error

184
00:08:17,670 --> 00:08:21,753
‫saying that we could not find any tour for the given ID.

185
00:08:23,030 --> 00:08:26,250
‫So let's do that very simple solution,

186
00:08:26,250 --> 00:08:28,755
‫because, well, this is not the real API

187
00:08:28,755 --> 00:08:30,140
‫that we're building at this point,

188
00:08:30,140 --> 00:08:31,670
‫and in this case, it's not a problem

189
00:08:31,670 --> 00:08:34,690
‫to use an overly simplistic solution like that,

190
00:08:34,690 --> 00:08:37,400
‫because this is not the real thing that we're building here.

191
00:08:37,400 --> 00:08:39,490
‫We are really just trying to get familiar

192
00:08:39,490 --> 00:08:41,690
‫with the was that Express works.

193
00:08:41,690 --> 00:08:44,690
‫And the same thing can actually be said here, for example,

194
00:08:44,690 --> 00:08:46,520
‫when we...

195
00:08:46,520 --> 00:08:49,140
‫So down here, where we post a new tour,

196
00:08:49,140 --> 00:08:52,260
‫in the real world, we would always, always have to check

197
00:08:52,260 --> 00:08:54,210
‫if the user input is valid,

198
00:08:54,210 --> 00:08:56,680
‫so if it doesn't contain any malicious code,

199
00:08:56,680 --> 00:08:59,350
‫or really, anything that we don't want in our wrap.

200
00:08:59,350 --> 00:09:01,890
‫And again, we're gonna do that, of course, later,

201
00:09:01,890 --> 00:09:03,680
‫but in this small example here,

202
00:09:03,680 --> 00:09:07,070
‫I really just want to focus on the fundamentals, okay?

203
00:09:07,070 --> 00:09:10,100
‫So let's quickly implement what we were just saying,

204
00:09:10,100 --> 00:09:15,100
‫which is that if the ID is greater than tours dot length,

205
00:09:16,570 --> 00:09:20,730
‫so for example, let's say we have 12 tours in our array,

206
00:09:20,730 --> 00:09:24,710
‫well, if the ID is then 13, or 15, or whatever,

207
00:09:24,710 --> 00:09:27,750
‫well, in that case, the ID is not valid.

208
00:09:27,750 --> 00:09:31,000
‫So, we say return, and that's because

209
00:09:31,000 --> 00:09:34,180
‫we want to exit the function right at this point, okay?

210
00:09:34,180 --> 00:09:35,823
‫And so that's why we say return.

211
00:09:37,370 --> 00:09:40,040
‫Then we send a status of 404,

212
00:09:40,040 --> 00:09:42,893
‫because we couldn't find any tour for that ID,

213
00:09:44,106 --> 00:09:46,370
‫and then a simple JSON response

214
00:09:49,400 --> 00:09:51,563
‫with a status of fail.

215
00:09:52,740 --> 00:09:56,173
‫So fail is what we send whenever we have a 400 code.

216
00:09:58,180 --> 00:10:00,053
‫And then just a message property,

217
00:10:03,580 --> 00:10:04,663
‫invalid ID.

218
00:10:06,640 --> 00:10:07,820
‫All right.

219
00:10:07,820 --> 00:10:09,503
‫And so let's test that now.

220
00:10:10,740 --> 00:10:12,103
‫So we have our 23.

221
00:10:13,340 --> 00:10:16,900
‫And, indeed, 404 not found, invalid ID.

222
00:10:16,900 --> 00:10:19,810
‫So that's exactly what we just did, and,

223
00:10:19,810 --> 00:10:22,093
‫it looks like it's working, okay?

224
00:10:24,230 --> 00:10:25,860
‫Another solution that we could

225
00:10:25,860 --> 00:10:27,490
‫of course implement here as well

226
00:10:27,490 --> 00:10:29,480
‫would be to just do this test

227
00:10:29,480 --> 00:10:32,163
‫after we do the tour here.

228
00:10:34,440 --> 00:10:36,100
‫So we would get the ID,

229
00:10:36,100 --> 00:10:38,230
‫then we would try to find a tour,

230
00:10:38,230 --> 00:10:39,810
‫and if there was no tour,

231
00:10:39,810 --> 00:10:42,670
‫well then we would say that the ID is invalid.

232
00:10:42,670 --> 00:10:45,600
‫So let's comment out this one, duplicate,

233
00:10:45,600 --> 00:10:48,950
‫just so that we actually keep both solutions here.

234
00:10:48,950 --> 00:10:52,000
‫And so we can say, if there is no tour, okay?

235
00:10:52,000 --> 00:10:53,970
‫So basically, the result here,

236
00:10:53,970 --> 00:10:56,190
‫if there is no tour found,

237
00:10:56,190 --> 00:10:59,130
‫well then this variable is basically undefined,

238
00:10:59,130 --> 00:11:01,840
‫and we can then test for that here, like this.

239
00:11:01,840 --> 00:11:05,790
‫So if there is no tour, so if tour is basically undefined,

240
00:11:05,790 --> 00:11:09,183
‫well, then we send back this error message.

241
00:11:10,330 --> 00:11:12,010
‫So let's test that as well.

242
00:11:12,010 --> 00:11:14,820
‫And so indeed, it gives us the same result.

243
00:11:14,820 --> 00:11:16,590
‫Okay, and just like that,

244
00:11:16,590 --> 00:11:18,750
‫you learned how to specify parameters

245
00:11:18,750 --> 00:11:21,680
‫in a URL, like this, okay?

246
00:11:21,680 --> 00:11:24,470
‫Then you learned how to read these parameters

247
00:11:24,470 --> 00:11:27,650
‫from the URL, by using req dot params.

248
00:11:27,650 --> 00:11:31,650
‫Well, and then we used that ID, so that parameter,

249
00:11:31,650 --> 00:11:35,140
‫in order to find a tour with that exact ID.

250
00:11:35,140 --> 00:11:38,210
‫So that's what we did here, in this line, okay?

251
00:11:38,210 --> 00:11:40,520
‫So that was the goal for this video,

252
00:11:40,520 --> 00:11:42,843
‫and so let's now move on to the next one.

