In: Computer Science
For this assignment, You will create a NodeJS application which takes a city name as an input in its pug template. using openweathermap API, you should get the weather of that particular city and displays that information to a new pug template. You should also store the results in a file in your directory. Following are the detailed requirements.
Your application should start with a pug template (similar to HTML page) which has a form with an input field and label to accept the city name and a button on clicking which we can send a GET request to the server.
Your server code (Back-end) should be able to take this city name, make an API call to the openweathermap API.
You should be able successfully to establish the API call and retrieve data from it.
You should also be able to display this data in a new pug template.
This same pug template will also have a form in which we should be able to enter the data you that we received from openweathermap.
On entering and submitting that data, You should be able to make a POST request to your back-end.
Your back-end code should write those values to a file in your local directory using async and fs.
Openweathermap API documentation: https://openweathermap.org/api
CODE:
app.js
var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var index = require('./routes/index'); var users = require('./routes/users'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // uncomment after placing your favicon in /public //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); //telling app to use inde.js for routes app.use('/', index); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;
index.js file
var express = require('express'); var router = express.Router(); var request=require('request'); const fs = require('fs') //function to write in a file const writeFile = (path, data, opts = 'utf8') => new Promise((res, rej) => { fs.writeFile(path, data, opts, (err) => { if (err) rej(err); else res() }) }); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); router.get('/city',function (req,res,next) { console.log(req.query.city); //get request request.get('https://samples.openweathermap.org/data/2.5/weather?q='+req.query.city+'&appid=b6907d289e10d714a6e88b30761fae22',function(err,res2){ if(err) throw new Error(err); else { //sending data to the new pug template named post.jade res.render('post', {data: res2.body}); //console.log(res2.body) } }); }); router.post('/write',function (req,res,next) { console.log(req.body.write); async function write(data) { await writeFile('/home/sys1108/Desktop/weather.json',data,) res.render('index',{title:"data write success"}) } write(req.body.write) }); module.exports = router;
index.jade
extends layout block content h1= title form(name="weather-report", method="get", action="/city") div.input span.label City Name: input(type="text", name="city") div.actions input(type="submit", value="Submit")
post.jade
extends layout block content h2="Response from the Api" p #{data} h2="copy the above response and paste in below box to make a post request" form(name="weather-report", method="post", action="/write") div.input span.label textarea(name="write", cols="40", rows="5") div.actions input(type="submit", value="Submit")
layout.jade
doctype html html head title= title link(rel='stylesheet', href='/stylesheets/style.css') body block content
error.jade
extends layout block content h1= message h2= error.status pre #{error.stack}
============================================
project structure and files:
app.js file
index.js file
index.jade
post.jade
layout.jade
error.jade
output: