WEBVTT

1
00:00:01.300 --> 00:00:04.970
<v Jason>Alright, so let's set up our project</v>

2
00:00:04.970 --> 00:00:08.210
and also start to load some recipe data

3
00:00:08.210 --> 00:00:10.363
from the Forkify API.

4
00:00:12.620 --> 00:00:17.620
And here as always, I already have the starter files loaded.

5
00:00:17.850 --> 00:00:22.090
Now this time we have a bit of a different structure here,

6
00:00:22.090 --> 00:00:26.580
so I have index.html out here, but then all the rest,

7
00:00:26.580 --> 00:00:29.490
all four assets for this project are here

8
00:00:29.490 --> 00:00:30.993
in the source folder.

9
00:00:32.210 --> 00:00:36.563
So in the source, we have images, JavaScript, and Sass.

10
00:00:38.230 --> 00:00:42.560
So for JavaScript, right now we have controller.js,

11
00:00:42.560 --> 00:00:45.963
which contains this little starter code here.

12
00:00:46.960 --> 00:00:49.990
And then I have this Sass folder.

13
00:00:49.990 --> 00:00:51.360
And in case you don't know,

14
00:00:51.360 --> 00:00:55.770
Sass is basically a better way of writing CSS,

15
00:00:55.770 --> 00:00:58.410
which has some nice additional features,

16
00:00:58.410 --> 00:01:02.300
which makes writing CSS in a large scale application

17
00:01:02.300 --> 00:01:04.100
a lot easier.

18
00:01:04.100 --> 00:01:07.450
Now, browsers actually don't understand Sass

19
00:01:07.450 --> 00:01:10.860
and so it has to be converted to CSS.

20
00:01:10.860 --> 00:01:13.840
And so Parcel is going to do that for us.

21
00:01:13.840 --> 00:01:16.700
And so I left these Sass files here

22
00:01:16.700 --> 00:01:20.690
so that you can see that Parcel is actually also capable

23
00:01:20.690 --> 00:01:21.853
of doing that.

24
00:01:24.070 --> 00:01:27.360
And then here just some images and of course down here,

25
00:01:27.360 --> 00:01:31.410
we have our flowcharts and also a small diagram

26
00:01:31.410 --> 00:01:32.793
about the architecture.

27
00:01:33.940 --> 00:01:34.860
Okay.

28
00:01:34.860 --> 00:01:37.563
But now let's open up a new terminal here.

29
00:01:39.950 --> 00:01:42.620
And then just like before we need to initialize

30
00:01:42.620 --> 00:01:45.590
a new project by writing npm init.

31
00:01:46.810 --> 00:01:51.550
And so this command will then create or package .json file.

32
00:01:51.550 --> 00:01:55.540
So this project should be called simply Forkify

33
00:01:56.620 --> 00:01:58.563
and the version might be version one.

34
00:01:59.870 --> 00:02:04.000
Here, let's just say Recipe application,

35
00:02:04.000 --> 00:02:06.400
or really whatever you want.

36
00:02:06.400 --> 00:02:09.763
Then this one doesn't matter neither this one.

37
00:02:11.060 --> 00:02:15.273
And now you can just add your own name here if you'd like.

38
00:02:17.530 --> 00:02:18.893
And so that's it.

39
00:02:19.850 --> 00:02:20.850
And so again,

40
00:02:20.850 --> 00:02:25.850
this now created this package.json file right here.

41
00:02:26.870 --> 00:02:29.220
Let's get rid of this one here actually,

42
00:02:29.220 --> 00:02:33.890
or actually let's just change it to .html.

43
00:02:33.890 --> 00:02:36.030
So this is kind of our entry point

44
00:02:36.030 --> 00:02:37.540
so let's specify it here,

45
00:02:37.540 --> 00:02:39.870
even though it's not really important.

46
00:02:39.870 --> 00:02:44.200
And here I will start by setting up the npm scripts now.

47
00:02:44.200 --> 00:02:46.850
So just as we did in the last section,

48
00:02:46.850 --> 00:02:51.800
so this one is going to be npm start instead.

49
00:02:51.800 --> 00:02:56.800
And here we will want to start Parcel on index.html.

50
00:02:59.800 --> 00:03:03.733
So index.html is again going to be your entry point.

51
00:03:04.640 --> 00:03:06.920
And then since we are here,

52
00:03:06.920 --> 00:03:11.260
let's also already add or build script.

53
00:03:11.260 --> 00:03:13.620
So basically the command that we are going to run

54
00:03:13.620 --> 00:03:16.933
in the end once we're already building the application.

55
00:03:19.040 --> 00:03:21.013
And again, index.htm.

56
00:03:22.000 --> 00:03:25.540
Now, sometimes in projects we don't even have an html.

57
00:03:25.540 --> 00:03:27.110
And so of course the entry point

58
00:03:27.110 --> 00:03:29.510
can also be a JavaScript file.

59
00:03:29.510 --> 00:03:33.390
And also this could be in a different folder

60
00:03:33.390 --> 00:03:37.430
and we can specify all that here in the Parcel command.

61
00:03:37.430 --> 00:03:40.953
But once again, we are just keeping it very simple here.

62
00:03:41.960 --> 00:03:44.850
Now, in order to actually run Parcel,

63
00:03:44.850 --> 00:03:46.450
of course we need to install it.

64
00:03:47.480 --> 00:03:50.450
Now in the last section, we simply installed Parcel

65
00:03:50.450 --> 00:03:54.900
by writing npm install Parcel,

66
00:03:54.900 --> 00:03:58.230
and then as a dev dependency like this.

67
00:03:58.230 --> 00:04:00.660
And so this would then basically install

68
00:04:00.660 --> 00:04:03.810
simply the latest version that is available on npm

69
00:04:03.810 --> 00:04:05.380
for Parcel.

70
00:04:05.380 --> 00:04:07.580
And at the time I'm recording

71
00:04:07.580 --> 00:04:10.850
that is version one point something

72
00:04:10.850 --> 00:04:14.490
However, Parcel 2 is almost ready at this point.

73
00:04:14.490 --> 00:04:18.290
And so I want to use a beta version of Parcel 2

74
00:04:18.290 --> 00:04:21.400
so that you can use Parcel 2 in the future.

75
00:04:21.400 --> 00:04:22.233
Alright.

76
00:04:23.920 --> 00:04:26.210
So if Parcel 2 was already out,

77
00:04:26.210 --> 00:04:29.303
then we would simply write @2 like this.

78
00:04:30.200 --> 00:04:32.940
However, right now it's just a beta version.

79
00:04:32.940 --> 00:04:35.410
And so I have to type @next

80
00:04:36.290 --> 00:04:39.400
and then edit as a dev dependency.

81
00:04:39.400 --> 00:04:42.130
So again, I am writing @next here

82
00:04:42.130 --> 00:04:43.783
to install a beta version.

83
00:04:45.170 --> 00:04:48.780
So let me run this and in case you get any error,

84
00:04:48.780 --> 00:04:53.520
then please go ahead and simply install Parcel@2.

85
00:04:53.520 --> 00:04:56.250
So you see here that this is going to install

86
00:04:56.250 --> 00:04:58.853
at 2.0.0-beta.1.

87
00:05:02.960 --> 00:05:05.350
Now okay, and here we go.

88
00:05:05.350 --> 00:05:09.660
So again, you see that we are at 2.0.0-beta.1.

89
00:05:09.660 --> 00:05:12.060
And if you got some error here again,

90
00:05:12.060 --> 00:05:15.370
then please try a Parcel@2.

91
00:05:15.370 --> 00:05:18.180
So it's really important for the rest of this section

92
00:05:18.180 --> 00:05:22.770
that we are actually all on Parcel 2 dot something.

93
00:05:22.770 --> 00:05:26.400
So here it doesn't matter if you have 2.1 or two or three,

94
00:05:26.400 --> 00:05:28.103
but it should be two.

95
00:05:29.030 --> 00:05:31.480
So that's what matters from this part.

96
00:05:31.480 --> 00:05:34.960
And so now let's actually start Parcel

97
00:05:34.960 --> 00:05:39.960
by running our npm script, npm run start.

98
00:05:40.280 --> 00:05:44.980
And actually the start script is a special one in npm

99
00:05:44.980 --> 00:05:47.273
for which one you don't even need the run.

100
00:05:48.230 --> 00:05:50.650
So you can just write npm start

101
00:05:50.650 --> 00:05:53.783
and that will then call your start script.

102
00:05:56.580 --> 00:06:00.920
So it's installing Sass and now we got this error here

103
00:06:00.920 --> 00:06:03.370
for the module, Sass.

104
00:06:03.370 --> 00:06:06.140
And so lets quit this here with control C

105
00:06:07.110 --> 00:06:11.400
and then I just say, npm install.

106
00:06:11.400 --> 00:06:14.973
And so this will then install Sass here for us.

107
00:06:15.950 --> 00:06:18.690
But if you're still running into some kind of error

108
00:06:18.690 --> 00:06:22.720
with Sass here then please just try to install Sass

109
00:06:22.720 --> 00:06:25.160
using the exact same version number.

110
00:06:25.160 --> 00:06:29.803
So npm install Sass, and then at 1.26.10.

111
00:06:32.030 --> 00:06:35.700
And so that should then fix any remaining problem.

112
00:06:35.700 --> 00:06:38.710
And if it didn't, so if even after that

113
00:06:38.710 --> 00:06:42.440
you still run into some problems either with Sass

114
00:06:42.440 --> 00:06:46.010
or with installing Parcel or running Parcel,

115
00:06:46.010 --> 00:06:49.460
then please take a look at the frequently asked questions

116
00:06:49.460 --> 00:06:50.963
in the GitHub repo.

117
00:06:52.210 --> 00:06:56.330
And only in the last case, you can of course also ask

118
00:06:56.330 --> 00:06:58.870
in the course Q and A section.

119
00:06:58.870 --> 00:07:03.870
But anyway, if we now try to run npm start again,

120
00:07:03.940 --> 00:07:05.523
then it will work.

121
00:07:07.480 --> 00:07:09.283
And indeed here it is.

122
00:07:10.600 --> 00:07:13.410
So we now have to note modules folder,

123
00:07:13.410 --> 00:07:17.450
which contains well tons of modules.

124
00:07:17.450 --> 00:07:21.850
And then we also have our distribution folder, right?

125
00:07:21.850 --> 00:07:25.730
And you see that here everything is in one folder.

126
00:07:25.730 --> 00:07:30.730
So our index.html and then also the controller script,

127
00:07:30.840 --> 00:07:34.410
which is this one, well not really this one,

128
00:07:34.410 --> 00:07:36.160
but the compiled one.

129
00:07:36.160 --> 00:07:39.970
And also you see that now we have an actual CSS file

130
00:07:40.960 --> 00:07:42.803
and you also see all the images.

131
00:07:44.710 --> 00:07:49.710
So a real CSS file, let's take a look at index as well.

132
00:07:51.230 --> 00:07:55.230
And so you see that now it replaced the controller js

133
00:07:55.230 --> 00:07:59.310
here in the source and also here I was referencing

134
00:07:59.310 --> 00:08:03.140
the SCSS file, so the SCCS file.

135
00:08:03.140 --> 00:08:06.630
And it is because of this that Parcel actually knows

136
00:08:06.630 --> 00:08:10.920
that it needs to compile the Sass file to CSS.

137
00:08:10.920 --> 00:08:13.970
So basically I referenced the Sass file here

138
00:08:13.970 --> 00:08:17.760
and therefore Parcel knew that it had to include that file

139
00:08:17.760 --> 00:08:21.470
in the distribution as well and to also replace

140
00:08:21.470 --> 00:08:24.620
the under link to the actual final CSS file.

141
00:08:24.620 --> 00:08:27.743
And the same is true for all the images.

142
00:08:28.820 --> 00:08:31.000
So it basically copied all the images

143
00:08:31.000 --> 00:08:34.730
to the distribution folder and gave them a new name

144
00:08:34.730 --> 00:08:37.963
and replaced their source here in the html.

145
00:08:40.170 --> 00:08:43.100
And this is very important to keep in mind

146
00:08:43.100 --> 00:08:46.203
as we go building this project.

147
00:08:47.050 --> 00:08:49.550
But of course this folder here

148
00:08:49.550 --> 00:08:52.930
is not really important for us in development.

149
00:08:52.930 --> 00:08:54.830
So everything that we will develop

150
00:08:54.830 --> 00:08:57.740
will be here in the source folder

151
00:08:57.740 --> 00:09:00.160
and only what we then see in the browser

152
00:09:00.160 --> 00:09:02.553
is actually coming from this distribution.

153
00:09:03.400 --> 00:09:07.440
So again, that's the whole logic of having a module bundler.

154
00:09:07.440 --> 00:09:10.780
So it takes, or basically a raw source code

155
00:09:10.780 --> 00:09:15.500
and compiles it into this nice package here, let's say,

156
00:09:15.500 --> 00:09:18.773
so this folder that is ready to ship to browsers.

157
00:09:22.140 --> 00:09:25.710
So for now we no longer need this html file

158
00:09:25.710 --> 00:09:29.110
and so we can now think about our controller here

159
00:09:29.110 --> 00:09:33.140
and actually think about making our first API call.

160
00:09:33.140 --> 00:09:36.100
And we can actually also open the page here

161
00:09:36.100 --> 00:09:39.383
by clicking option down here.

162
00:09:40.900 --> 00:09:43.403
Well, that opened in another tab for me.

163
00:09:44.270 --> 00:09:48.363
So let me just copy it right here.

164
00:09:51.279 --> 00:09:53.920
Let's open up the developer tools as well,

165
00:09:53.920 --> 00:09:57.020
but for now of course we have nothing here

166
00:09:57.020 --> 00:09:59.370
because we don't have any code yet.

167
00:09:59.370 --> 00:10:04.300
But let's just lock something to the console,

168
00:10:04.300 --> 00:10:07.970
just to see that our Parcel setup is working.

169
00:10:07.970 --> 00:10:11.420
And you see that it already built a new version.

170
00:10:11.420 --> 00:10:14.453
And indeed we have tests now in our console.

171
00:10:15.660 --> 00:10:16.630
Great.

172
00:10:16.630 --> 00:10:20.230
So everything is working and so yeah,

173
00:10:20.230 --> 00:10:23.710
let's now make our first API call.

174
00:10:23.710 --> 00:10:27.630
Now, for this project I actually developed my own API

175
00:10:27.630 --> 00:10:31.023
so that we are not dependent on any third party services.

176
00:10:31.870 --> 00:10:34.343
And the API is at this page.

177
00:10:35.600 --> 00:10:37.720
So let's copy it and let's go there

178
00:10:37.720 --> 00:10:39.593
to check out the documentation.

179
00:10:40.760 --> 00:10:44.380
So any good API needs some sort of documentation.

180
00:10:44.380 --> 00:10:47.170
And so this is the documentation that I wrote

181
00:10:47.170 --> 00:10:51.340
for our Forkify API version two.

182
00:10:51.340 --> 00:10:55.810
So version one was for the old version of this course.

183
00:10:55.810 --> 00:10:58.590
So some details about this API

184
00:10:58.590 --> 00:11:01.050
is that search terms are limited.

185
00:11:01.050 --> 00:11:03.000
All you can search for is the terms

186
00:11:03.000 --> 00:11:04.973
that are in this list here,

187
00:11:06.270 --> 00:11:09.193
but to test this application that should be enough.

188
00:11:10.660 --> 00:11:14.600
And you can only make 100 API requests per hour

189
00:11:14.600 --> 00:11:17.430
in order not to overload our servers.

190
00:11:17.430 --> 00:11:20.590
Because again, this is here my own API

191
00:11:20.590 --> 00:11:22.383
that I'm running on my own server.

192
00:11:23.270 --> 00:11:25.800
Then the API key is what we will need

193
00:11:25.800 --> 00:11:28.040
to upload our own recipes.

194
00:11:28.040 --> 00:11:30.640
But again, more about that later.

195
00:11:30.640 --> 00:11:34.750
And then here we have basically our main URLs

196
00:11:34.750 --> 00:11:37.900
or routes of this API.

197
00:11:37.900 --> 00:11:41.040
So the first one is used to get all the recipes

198
00:11:41.040 --> 00:11:43.360
or to create a recipe.

199
00:11:43.360 --> 00:11:45.760
But for now let's focus on this one,

200
00:11:45.760 --> 00:11:49.093
which is simple to get one single recipe.

201
00:11:50.090 --> 00:11:54.633
So the path of this part of the API is this here.

202
00:11:55.750 --> 00:12:00.750
So this URL then slash recipes slash the ID of a recipe.

203
00:12:01.500 --> 00:12:03.870
And down here is an example of that.

204
00:12:03.870 --> 00:12:07.010
So for example, this one here might be the ID

205
00:12:08.030 --> 00:12:09.210
and then here the key,

206
00:12:09.210 --> 00:12:11.860
but again the key doesn't matter for now.

207
00:12:11.860 --> 00:12:14.530
And we can click on this and then see exactly

208
00:12:14.530 --> 00:12:17.750
the kind of result that we will get.

209
00:12:17.750 --> 00:12:20.170
And so actually this is the URL

210
00:12:20.170 --> 00:12:22.710
that for now we will use in our code

211
00:12:22.710 --> 00:12:26.040
to basically get exactly this recipe here

212
00:12:26.040 --> 00:12:28.020
in our application.

213
00:12:28.020 --> 00:12:31.703
So let's copy this and go back to our code.

214
00:12:33.640 --> 00:12:38.300
And so now as always to make an Ajax request to an API

215
00:12:38.300 --> 00:12:40.273
we use the fetch function.

216
00:12:42.570 --> 00:12:43.470
And now that we have this,

217
00:12:43.470 --> 00:12:47.420
let's actually create some function around this.

218
00:12:47.420 --> 00:12:50.873
So an async function so that we can use a single wait.

219
00:12:52.500 --> 00:12:55.133
So let's call it showrecipe.

220
00:12:59.055 --> 00:13:00.673
So an async function.

221
00:13:03.760 --> 00:13:07.873
And then here as always, we use a try catch.

222
00:13:09.170 --> 00:13:13.123
And if there is an error, we want to alert that error.

223
00:13:14.250 --> 00:13:17.620
So very simple error handling for now.

224
00:13:17.620 --> 00:13:21.400
And now let's take this here and await it

225
00:13:21.400 --> 00:13:25.700
and store the result into the res variable,

226
00:13:25.700 --> 00:13:28.040
which stands for response.

227
00:13:28.040 --> 00:13:29.740
And I hope that all of this here

228
00:13:29.740 --> 00:13:32.360
is nothing new for you at this point

229
00:13:32.360 --> 00:13:34.353
after the last couple of sections.

230
00:13:36.210 --> 00:13:39.500
So just keep in mind that using the fetch function here

231
00:13:39.500 --> 00:13:41.310
will return a promise.

232
00:13:41.310 --> 00:13:44.200
And so, since we are in an async function,

233
00:13:44.200 --> 00:13:46.960
we can then await that promise.

234
00:13:46.960 --> 00:13:49.630
So basically we will stop the code execution here

235
00:13:49.630 --> 00:13:52.230
at this point, but that's not a problem

236
00:13:52.230 --> 00:13:55.090
because this is an async function anyway,

237
00:13:55.090 --> 00:13:57.490
which only runs in the background.

238
00:13:57.490 --> 00:14:01.263
So we are not blocking our main thread of execution here.

239
00:14:02.230 --> 00:14:05.580
But anyway, once we have that result,

240
00:14:05.580 --> 00:14:08.803
we then need to convert that to json.

241
00:14:10.430 --> 00:14:13.550
So as always, let's create a data variable

242
00:14:13.550 --> 00:14:18.023
and then await the response .json.

243
00:14:19.890 --> 00:14:24.440
So the json method is, again, a method that is available

244
00:14:24.440 --> 00:14:27.240
on all the response objects.

245
00:14:27.240 --> 00:14:29.730
And a response object is exactly

246
00:14:29.730 --> 00:14:32.220
what the fetch function here returns.

247
00:14:32.220 --> 00:14:36.850
And so yeah, we can then call json on that response,

248
00:14:36.850 --> 00:14:38.810
which returns another promise,

249
00:14:38.810 --> 00:14:41.210
which we then have to await again.

250
00:14:41.210 --> 00:14:43.530
And in the end we will then get our data

251
00:14:43.530 --> 00:14:45.483
stored to that variable.

252
00:14:47.220 --> 00:14:50.960
And then that's actually console.log,

253
00:14:50.960 --> 00:14:54.433
both the response and also the data.

254
00:14:56.570 --> 00:14:59.020
So, give it a safe.

255
00:14:59.020 --> 00:15:02.710
And we also should call this here right at the beginning

256
00:15:02.710 --> 00:15:05.223
because otherwise nothing is going to happen.

257
00:15:06.570 --> 00:15:10.463
And so which one is ours? Here we are.

258
00:15:12.450 --> 00:15:15.840
And you see that we already have a result here.

259
00:15:15.840 --> 00:15:18.170
So first is the response.

260
00:15:18.170 --> 00:15:20.260
And so again as I mentioned,

261
00:15:20.260 --> 00:15:23.240
this returns a response object,

262
00:15:23.240 --> 00:15:26.290
but then the data itself is here.

263
00:15:26.290 --> 00:15:30.653
And so we get this status here and then the data itself.

264
00:15:31.660 --> 00:15:33.223
Make it a bit bigger here.

265
00:15:36.020 --> 00:15:40.543
And so then here, inside of data we get the recipe itself.

266
00:15:43.570 --> 00:15:47.060
So it contains all of this data here, cooking time,

267
00:15:47.060 --> 00:15:51.860
the ID itself, then the ingredients, publisher, servings

268
00:15:51.860 --> 00:15:53.453
and so on and so forth.

269
00:15:54.440 --> 00:15:56.333
So that works beautifully.

270
00:15:57.290 --> 00:15:59.870
And as always, we started here assuming

271
00:15:59.870 --> 00:16:01.780
that there will be success,

272
00:16:01.780 --> 00:16:04.960
but now let's try to create a wrong ID here,

273
00:16:04.960 --> 00:16:07.283
which doesn't exist on the server.

274
00:16:08.520 --> 00:16:12.233
So just something like this and let's see what happens then.

275
00:16:13.970 --> 00:16:18.283
And so you see, we get the bad request.

276
00:16:19.640 --> 00:16:21.190
Here then in the response,

277
00:16:21.190 --> 00:16:24.240
we can see that ok is set to false.

278
00:16:24.240 --> 00:16:27.303
And so this is what we're going to use, remember that.

279
00:16:28.180 --> 00:16:29.870
So when ok is set to false

280
00:16:29.870 --> 00:16:33.260
means that there was some kind of error in the fetch.

281
00:16:33.260 --> 00:16:36.780
And so we can then use that to create our own errors.

282
00:16:36.780 --> 00:16:37.613
So again,

283
00:16:37.613 --> 00:16:40.823
just like we learned in the asynchronous JavaScript section.

284
00:16:43.510 --> 00:16:46.950
But then we still get a response here

285
00:16:46.950 --> 00:16:49.710
and this response says fail.

286
00:16:49.710 --> 00:16:51.860
And then also this message of invalid_id

287
00:16:53.273 --> 00:16:55.800
and then the ID that we provided.

288
00:16:55.800 --> 00:17:00.710
So also the API itself returns a nice error message.

289
00:17:00.710 --> 00:17:03.523
And so lets actually use that error message now.

290
00:17:05.340 --> 00:17:07.180
Because simply bad requests

291
00:17:07.180 --> 00:17:10.030
is not a very informative error message.

292
00:17:10.030 --> 00:17:12.370
It's way better to actually use the one

293
00:17:12.370 --> 00:17:14.363
that the API returned to us.

294
00:17:15.576 --> 00:17:19.747
And so that's at .message of this object.

295
00:17:21.890 --> 00:17:24.443
So, we need to do that after this one here.

296
00:17:26.050 --> 00:17:31.050
And so we can say if res.ok is false.

297
00:17:31.550 --> 00:17:34.853
So basically if response is not okay,

298
00:17:36.416 --> 00:17:39.213
then we want to throw a new error.

299
00:17:42.501 --> 00:17:45.883
And then in there we can use the .message property

300
00:17:47.330 --> 00:17:49.150
that I just mentioned.

301
00:17:49.150 --> 00:17:52.080
And again, that one is already coming from the data.

302
00:17:52.080 --> 00:17:54.480
So from the response of the server

303
00:17:54.480 --> 00:17:58.693
while the ok property is stored in the response itself.

304
00:18:00.670 --> 00:18:03.063
And then that's also provide the status code.

305
00:18:04.340 --> 00:18:08.383
So that is at res.status.

306
00:18:09.380 --> 00:18:11.530
Now okay and so...

307
00:18:12.480 --> 00:18:16.630
And you see that somehow we already get the error here,

308
00:18:16.630 --> 00:18:18.690
even though we're not at Chrome.

309
00:18:18.690 --> 00:18:21.410
But anyway, that alert window appeared,

310
00:18:21.410 --> 00:18:24.450
of course because down here the catch error,

311
00:18:24.450 --> 00:18:27.110
we are alerting exactly that error

312
00:18:27.110 --> 00:18:30.250
that we throw here in the try block.

313
00:18:30.250 --> 00:18:31.750
Right?

314
00:18:31.750 --> 00:18:35.203
And so as we go here, let's just try to reload.

315
00:18:36.290 --> 00:18:40.433
And so indeed, here we get our error as an alert window.

316
00:18:43.962 --> 00:18:46.170
But now let's take it back actually...

317
00:18:49.260 --> 00:18:51.900
But now let's take it back actually.

318
00:18:51.900 --> 00:18:56.723
And so when we're back then our data here is also back here.

319
00:18:59.020 --> 00:19:02.900
Now just to finish, lets actually format that data

320
00:19:02.900 --> 00:19:04.540
a little bit nicer.

321
00:19:04.540 --> 00:19:07.000
So basically I want to create a new object

322
00:19:07.000 --> 00:19:12.000
based on this object which has some better variable names.

323
00:19:13.000 --> 00:19:15.650
So here we have for example these underscores

324
00:19:15.650 --> 00:19:18.340
and these are very unusual in JavaScript.

325
00:19:18.340 --> 00:19:20.410
And so many times what we do

326
00:19:20.410 --> 00:19:23.670
is to basically kind of reformat this object

327
00:19:23.670 --> 00:19:25.070
that we get here.

328
00:19:25.070 --> 00:19:28.193
So basically I want to get rid of these underscores.

329
00:19:29.150 --> 00:19:32.083
And so...

330
00:19:32.083 --> 00:19:34.513
So lets create a new recipe variable,

331
00:19:37.280 --> 00:19:40.100
which should be data.

332
00:19:40.100 --> 00:19:43.360
And then remember that it is again data,

333
00:19:43.360 --> 00:19:45.773
and then dot recipe.

334
00:19:46.780 --> 00:19:48.930
So let's see that again, just to make sure.

335
00:19:50.360 --> 00:19:52.980
So this here is the data variable.

336
00:19:52.980 --> 00:19:55.090
And then in there we have data again

337
00:19:55.090 --> 00:19:57.513
and then in there is .recipe.

338
00:20:00.370 --> 00:20:03.050
And so here we have recipes on both sides

339
00:20:03.050 --> 00:20:05.003
and so we can use this structuring.

340
00:20:06.210 --> 00:20:07.953
So let's take that back.

341
00:20:08.880 --> 00:20:12.650
And I called this one a recipe with let

342
00:20:12.650 --> 00:20:16.430
so that we can now basically create a new recipe object

343
00:20:16.430 --> 00:20:17.363
based on that.

344
00:20:20.600 --> 00:20:22.283
So the id is the recipe.id.

345
00:20:26.099 --> 00:20:28.307
Your title is gonna be recipe.title.

346
00:20:32.040 --> 00:20:35.453
The publisher will be recipe.publisher.

347
00:20:36.560 --> 00:20:39.110
And there would have been other ways of doing this,

348
00:20:39.110 --> 00:20:42.277
but this is kind of the quick and dirty way (chuckles).

349
00:20:43.440 --> 00:20:48.120
So source URL is going to be recipe.source_url.

350
00:20:52.603 --> 00:20:56.690
So this is one of the ones I wanted to change.

351
00:20:56.690 --> 00:20:59.920
Then there's also an image URL property.

352
00:20:59.920 --> 00:21:02.103
And this one I want to simply call image,

353
00:21:04.372 --> 00:21:05.205
image_url.

354
00:21:08.999 --> 00:21:11.953
Then the servings might be just recipe.servings.

355
00:21:13.070 --> 00:21:14.580
And we're almost done here.

356
00:21:14.580 --> 00:21:19.350
So cooking time is the recipe.cooking_time

357
00:21:19.350 --> 00:21:20.563
with an underscore.

358
00:21:23.230 --> 00:21:27.253
And finally ingredients is recipe.ingredients.

359
00:21:31.730 --> 00:21:33.520
Now let's actually get rid of this

360
00:21:33.520 --> 00:21:37.630
and simply lock to the console, the recipe object

361
00:21:37.630 --> 00:21:38.793
that we just created.

362
00:21:40.170 --> 00:21:45.170
And here ingredients looks wrong ingredients like this

363
00:21:45.260 --> 00:21:46.403
and here the same.

364
00:21:47.740 --> 00:21:50.640
Everything else looks correct.

365
00:21:50.640 --> 00:21:52.930
And yeah.

366
00:21:52.930 --> 00:21:55.410
So here is our nicely formatted recipe

367
00:21:55.410 --> 00:21:57.663
that we just got from the server.

368
00:21:58.620 --> 00:22:02.970
And of course, that would work for other recipes as well.

369
00:22:02.970 --> 00:22:05.710
So let's go back to our documentation page

370
00:22:05.710 --> 00:22:07.820
and get some other ID.

371
00:22:07.820 --> 00:22:12.033
And so that ID, we can basically get from the search URL.

372
00:22:13.090 --> 00:22:15.090
So this path here will take us

373
00:22:15.090 --> 00:22:19.253
to all the recipes there are for a certain search query.

374
00:22:20.330 --> 00:22:23.033
So let's try this one here, which is for pizza.

375
00:22:24.430 --> 00:22:26.340
So you see it is the route.

376
00:22:26.340 --> 00:22:29.653
So the URL that I just told you slash recipes.

377
00:22:30.840 --> 00:22:35.410
And then we have this query, search set to pizza.

378
00:22:35.410 --> 00:22:37.510
So after this question mark.

379
00:22:37.510 --> 00:22:39.870
And this is a very common format

380
00:22:39.870 --> 00:22:43.720
of basically sending variables over your URLs.

381
00:22:43.720 --> 00:22:48.050
So search is like a variable and then pizza is that value.

382
00:22:48.050 --> 00:22:51.460
And so in this case, this is the query string.

383
00:22:51.460 --> 00:22:55.200
And in this case, what we want to search for is pizza.

384
00:22:55.200 --> 00:22:58.333
And so let's now just take any random ID of this.

385
00:23:00.194 --> 00:23:03.507
So with just copying it, let's go back here

386
00:23:04.866 --> 00:23:06.920
and then I will just duplicate this line

387
00:23:08.160 --> 00:23:12.517
and comment it and then replace this part here of the URL

388
00:23:13.860 --> 00:23:15.710
with this other ID.

389
00:23:15.710 --> 00:23:17.520
So you see it's slightly different.

390
00:23:17.520 --> 00:23:20.123
And so now we should get a different recipe.

391
00:23:21.990 --> 00:23:23.203
So let's see.

392
00:23:24.110 --> 00:23:28.123
And yeah, this time it is called Pepperoni Pizza Burgers.

393
00:23:28.970 --> 00:23:31.420
And so of course later in the real world,

394
00:23:31.420 --> 00:23:33.920
we will then get these different IDs

395
00:23:33.920 --> 00:23:37.453
from our search results here in the sidebar.

396
00:23:40.608 --> 00:23:43.920
So, we successfully started up our project

397
00:23:43.920 --> 00:23:48.390
and already did our first API call to the Forkify API

398
00:23:48.390 --> 00:23:51.430
that I created just for this project.

399
00:23:51.430 --> 00:23:54.270
So this was a nice start of the project.

400
00:23:54.270 --> 00:23:55.890
And now in the next video,

401
00:23:55.890 --> 00:23:59.290
we will then actually already render this data

402
00:23:59.290 --> 00:24:01.130
to the user interface

403
00:24:01.130 --> 00:24:05.240
in order to create something like this here.

404
00:24:05.240 --> 00:24:07.450
And I hope you're excited for that.

405
00:24:07.450 --> 00:24:09.343
And so let's quickly move on.

