· 6 years ago · Dec 12, 2019, 02:06 AM
1// Import the installed modules.
2const express = require('express');
3const responseTime = require('response-time')
4const axios = require('axios');
5const redis = require('redis');
6
7const app = express();
8
9// create and connect redis client to local instance.
10const client = redis.createClient();
11
12// Print redis errors to the console
13client.on('error', (err) => {
14 console.log("Error " + err);
15});
16
17// use response-time as a middleware
18app.use(responseTime());
19
20
21// create an api/search route
22app.get('/api/search', (req, res) => {
23 // Extract the query from url and trim trailing spaces
24 const query = (req.query.query).trim();
25 // Build the Wikipedia API url
26 const searchUrl = `https://en.wikipedia.org/w/api.php?action=parse&format=json§ion=0&page=${query}`;
27
28 // Try fetching the result from Redis first in case we have it cached
29 return client.get(`wikipedia:${query}`, (err, result) => {
30 // If that key exist in Redis store
31 if (result) {
32 const resultJSON = JSON.parse(result);
33 return res.status(200).json(resultJSON);
34 } else { // Key does not exist in Redis store
35 // Fetch directly from Wikipedia API
36 return axios.get(searchUrl)
37 .then(response => {
38 const responseJSON = response.data;
39 // Save the Wikipedia API response in Redis store
40 client.setex(`wikipedia:${query}`, 3600, JSON.stringify({ source: 'Redis Cache', ...responseJSON, }));
41 // Send JSON response to client
42 return res.status(200).json({ source: 'Wikipedia API', ...responseJSON, });
43 })
44 .catch(err => {
45 return res.json(err);
46 });
47 }
48 });
49});
50
51app.listen(3000, () => {
52 console.log('Server listening on port: ', 3000);
53});