Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
import express from "express";
const app = express();
app.set("port", 3000);
app.get("/",(req,res)=>{
let randomGetal = Math.random()*100;
res.type("text/html");
res.send(`Het random getal is ${randomGetal}`);
});
app.listen(app.get("port"), () =>
console.log("[server] http://localhost:" + app.get("port"))
);let randomGetal = Math.random()*100;res.send(`Het random getal is ${randomGetal}`);<html>
<body>
Hello world!
</body>
</html><html>
<body>
[DIT MOET DYNAMISCH ZIJN]
</body>
</html>npm install ejsnpm install --save-dev @types/ejsimport express from "express";
import ejs from "ejs";
const app = express();
app.set("view engine", "ejs"); // EJS als view engine
app.set("port", 3000);<h1>Hello World!</h1>
This is yet another boring hello world appimport express from "express";
const app = express();
app.set("view engine", "ejs"); // EJS als view engine
app.set("port", 3000);
app.get("/",(req,res)=>{
res.render("index");
})
app.listen(app.get("port"), ()=>console.log( "[server] http://localhost:" + app.get("port")));app.get("/",(req,res)=>{
res.render("index");
})app.get("/",(req,res)=>{
let randomGetal : number = Math.random()*100;
res.render("index", {aRandomNumber: randomGetal});
})app.get("/",(req,res)=>{
let randomGetal : number = Math.random()*100;
let randomGetal2 : number = randomGetal * 2;
res.render("index",
{
aRandomNumber: randomGetal,
name: "Sven",
age: 40,
someOtherNumber: randomGetal2
});
})<h1>Hello World!</h1>
<p>
This is yet another boring hello world app.
</p>
<p>
But this time we have a random
number which is <%= aRandomNumber %>
</p><%= variable_name %><%= person.name %><%= people[0] %><%
let firstName = "John";
let lastName = "Smith";
let age = Math.random() * 100;
%>
<h1>Hi</h1>
<p>
My name is <%= firstName %> <%= lastName %>
and I"m <%= age %> years old.
</p><% if (age > 50) { %>
<p>Je bent oud</p>
<% } else { %>
<p>Je bent jong</p>
<% } %><% for(let i=1; i<10;i++) { %>
<p>Hallo</p>
<% } %><% for(let i=1; i<10;i++) { %>
<p><%= i %></p>
<% } %>app.get("/",(req,res)=>{
let people : string[] = ["Sven", "Andie", "Sam", "Barbara"];
res.render("index", { people: people });
});<h1>People</h1>
<ul>
<% for(let person of people) { %>
<li><%= people[i] %></li>
<% } %>
</ul>interface Person {
name: string;
city: string;
age: number;
}
app.get("/",(req,res)=>{
let persons : Person[] = [
{name: "Sven", city: "Antwerpen", age: 40},
{name: "Andie", city: "Gent", age: 30},
{name: "Sam", city: "Brussel", age: 25},
{name: "Barbara", city: "Leuven", age: 35}
];
res.render("index", { persons: persons });
});<h1>People</h1>
<table>
<tr>
<th>Name</th>
<th>City</th>
<th>Age</th>
</tr>
<% for(let person of persons) { %>
<tr>
<td><%= person.name %></td>
<td><%= person.city %></td>
<td><%= person.age %></td>
</tr>
<% } %>
</table><h1>People</h1>
<table>
<tr>
<th>Name</th>
<th>City</th>
<th>Age</th>
</tr>
<% for(let person of persons) { %>
<% if (person.age > 30) { %>
<tr>
<td><%= person.name %></td>
<td><%= person.city %></td>
<td><%= person.age %></td>
</tr>
<% } %>
<% } %>
</table><!DOCTYPE html>
<html>
<head>
<title>My website</title>
</head>
<body>
<header>
<h1>My website</h1>
</header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<main>
<h1>Home</h1>
<p>Welcome to my website</p>
</main>
<footer>
<p>© 2021</p>
</footer>
</body>
</html><!DOCTYPE html>
<html>
<head>
<title>My website</title>
</head>
<body>
<header>
<h1>My website</h1>
</header>
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</nav>
<main> </main>
<footer>
<p>© 2021</p>
</footer>
</body>
</html><%- include("partials/header") %>
<h1>Home</h1>
<p>Welcome to my website</p>
<%- include("partials/footer") %>app.get("/headers",(req,res)=>{
let headers = req.headers;
res.json(headers);
})app.get("/headers",(req,res)=>{
let userAgent = req.headers["user-agent"];
res.type("text/html")
res.send(`Your browser is ${userAgent}`);
})app.get("/redirect",(req,res)=>{
res.redirect("https://google.com");
})app.get("/redirect",(req,res)=>{
res.redirect("back");
})app.get("/status",(req,res)=>{
res.status(404);
res.send("Not found");
})app.get("/status",(req,res)=>{
res.sendStatus(404);
})app.get("/headers",(req,res) => {
res.set("Content-Type","text/html");
res.send("<h1>Hello World</h1>");
})app.get("/headers", (req, res) => {
res.send("<h1>Hello World</h1>");
res.set("Content-Type", "text/html");
// Error: Can"t set headers after they are sent.
});app.get("/headers",(req,res)=>{
res.set("Content-Type","text/html");
res.send("<h1>Hello World</h1>");
})app.get("/type",(req,res)=>{
res.type("text/plain");
res.send("Hello World");
})[
{
firstname: "Sven",
lastname: "Charleer",
email: "sven.charleer@ap.be"
},
{
firstname: "Andie",
lastname: "Similon",
email: "andie.similon@ap.be"
},
]docker run -d \
-p 27017:27017 \
-v mongo-data:/data/db \
--name mongodb \
mongo:latest
import { MongoClient, ObjectId } from "mongodb";
const uri = "mongodb+srv://<username>:<password>@<your-cluster-url>/test?retryWrites=true&w=majority";
const client = new MongoClient(uri);
interface Pokemon {
_id?: ObjectId,
name: string,
age: number
}
async function main() {
try {
// Connect to the MongoDB cluster
await client.connect();
let pikachu: Pokemon = { name:"pikachu", age:12 };
const result = await client.db("Les").collection("pokemon").insertOne(pikachu);
console.log(`New document created with the following id: ${result.insertedId}`);
} catch (e) {
console.error(e);
} finally {
await client.close();
}
}
main();const pokemon: Pokemon[] = [
{name: "pichu", age:7},
{name: "flareon",age:3}
];const result = await client.db("Les").collection("pokemon").insertMany(pokemon);
console.log(`${result.insertedCount} new documents(s) created with the following id(s):`);
console.log(result.insertedIds);const pokemon: any[] = [
{name: "pichu", age:7},
{trainer: "ash"}
];let result = await client.db("Les").collection("pokemon").insertMany(pokemon);
console.log(`${result.insertedCount} new documents(s) created with the following id(s):`);
console.log(result.insertedIds);npm install mongodbimport { MongoClient } from "mongodb";
const uri = "mongodb+srv://<username>:<password>@<your-cluster-url>/test?retryWrites=true&w=majority";
const client = new MongoClient(uri);
async function main() {
try {
// Connect to the MongoDB cluster
await client.connect();
// Make the appropriate DB calls
//...
} catch (e) {
console.error(e);
} finally {
await client.close();
}
}
doSomeDBCalls();let result: Pokemon = await client.db("Les").collection("pokemon").findOne<Pokemon>({});
console.log(result);let result: Pokemon = await client.db("Les").collection("pokemon").findOne<Pokemon>({name:"eevee"});
console.log(result);let cursor = client.db("Les").collection("pokemon").find<Pokemon>({});
let result = await cursor.toArray();
console.log(result);import { MongoClient, ObjectId } from "mongodb";
const uri = "mongodb+srv://<username>:<password>@<your-cluster-url>/test?retryWrites=true&w=majority";
const client = new MongoClient(uri);
interface Pokemon {
_id?: ObjectId,
name: string,
age: number
}
async function main() {
try {
// Connect to the MongoDB cluster
await client.connect();
let pikachu: Pokemon = { name:"pikachu", age:12 };
const result = await client.db("Les").collection("pokemon").insertOne(pikachu);
console.log(`New document created with the following id: ${result.insertedId}`);
let cursor = client.db("Les").collection("pokemon").find<Pokemon>({});
let pokemons = await cursor.toArray();
console.log(pokemons);
} catch (e) {
console.error(e);
} finally {
await client.close();
}
}.
├── index.ts
└── routers
├── posts.ts
└── users.ts
└── comments.ts/posts
/users
/commentsexport default function postRouter(posts: Post[]) {
const router = express.Router();
router.get("/", (req, res) => {
res.json(posts);
});
router.get("/:id", (req, res) => {
const id = parseInt(req.params.id);
const post = posts.find(post => post.id === id);
if (post) {
res.json(post);
} else {
res.status(404).send("Post not found");
}
});
router.post("/", (req, res) => {
const newPost: Post = req.body;
posts.push(newPost);
res.json(newPost);
});
return router;
}import postRouter from "./routers/posts";app.use("/posts", postRouter(posts));GET /posts
GET /posts/:id
POST /postsapp.use((req, res, next) => {
console.log(`${req.method} ${req.path}`);
next();
});
app.get("/", (req, res) => {
res.render("index");
})app.use((req, res, next) => {
res.locals.title = "My website";
next();
});
app.get("/", (req, res) => {
res.render("index");
})<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><%= title %></title>
</head>
<body>
<h1><%= title %></h1>
</body>
</html>app.use((req, res, next) => {
const token = req.headers.authorization;
if (token !== "my-secret-token") {
res.status(401).send("Unauthorized");
} else {
next();
}
});
app.get("/", (req, res) => {
res.send("Hello world");
})import { Request, Response, NextFunction } from "express";
export const verifyAuthToken = (req: Request, res: Response, next: NextFunction) => {
const token = req.headers.authorization;
if (token !== "my-secret-token") {
res.status(401).send("Unauthorized");
} else {
next();
}
}import { verifyAuthToken } from "./middleware/verifyAuthToken";
app.use(verifyAuthToken);import { Request, Response, NextFunction } from "express";
export function ejsUtility(req: Request, res: Response, next: NextFunction) {
res.locals.formatDate = (date: Date) => {
return date.toISOString().split("T")[0];
}
res.locals.formatCurrency = (amount: number) => {
return amount.toLocaleString("nl-NL", { style: "currency", currency: "EUR" });
}
res.locals.random = (from: number, to: number) => {
return Math.floor(Math.random() * (to - from) + from);
}
next();
}import { ejsUtility } from "./middleware/ejsUtility";
app.use(ejsUtility);<%= formatDate(new Date()) %>
<%= formatCurrency(100) %>
<%= random(100,500) %>app.use((req, res, next) => {
res.status(404).render("error", { message: "Page not found" });
});import { Request, Response, NextFunction } from "express";
export const handleError = (err: any, req: Request, res: Response, next: NextFunction) => {
res.status(500).render("error",
{
message: err.message,
stack: err.stack
});
};import { handleError } from "./middleware/handleError";
app.use(handleError);<h1><%= message %></h1>
<pre>
<%= stack %>
</pre>const loggingMiddleware = (req: Request, res: Response, next: NextFunction) => {
console.log(`${req.ip} ${req.method} ${req.path}`);
next();
}
app.get("/", loggingMiddleware, (req, res) => {
res.render("index");
});
app.get("/admin", (req, res) => {
res.render("admin");
});import { Request, Response, NextFunction } from "express";
interface ErrorHandlerOptions {
statusCode: number;
}
export const errorHandler = (options: ErrorHandlerOptions) => {
return (err: any, req: Request, res: Response, next: NextFunction) => {
res.status(options.statusCode).render("error",
{
message: err.message,
stack: err.stack
}
});
}import { errorHandler } from "./middleware/errorHandler";
app.use(errorHandler({ statusCode: 500 }));import { Request, Response, NextFunction } from "express";
let requestLog : Record<string, number> = {};
interface MaxRequestsConfig {
maxRequests: number;
}
export function maxRequest(config : MaxRequestsConfig) {
return (req: Request, res: Response, next: NextFunction) => {
console.log(`${req.ip} ${req.method} ${req.path}`);
if (req.ip) {
requestLog[req.ip] = requestLog[req.ip] ? requestLog[req.ip] + 1 : 1;
if (requestLog[req.ip] > config.maxRequests) {
res.status(429).send("Too many requests for this IP address");
return;
}
}
next();
};
}import { maxRequest } from "./middleware/requestLimiter";
app.use(maxRequest({ maxRequests: 10 }));app.use(requestLimiter({ maxRequests: 10 }));
app.use(loggingMiddleware);const result = await collection.find({ age: { $gt: 18 } }).toArray();const result = await collection.find({ age: { $in: [18, 19, 20] } }).toArray();const result = await collection.find({ $or: [{ age: { $gt: 18 } }, { name: "John" }] }).toArray();const result = await collection.find({ $and: [{ age: { $gt: 18 } }, { age: { $lt: 25 } }] }).toArray();const result = await collection.find({ age: { $not: { $gt: 18 } } }).toArray();interface Book {
_id: ObjectId;
title: string;
summary: string;
}const collection : Collection<Book> = client.db("library").collection<Book>("books"); const books: Book[] = [
{ title: "The Great Gatsby", summary: "A book about a rich guy" },
{ title: "MongoDB for Dummies", summary: "A book about a database" },
{ title: "The Catcher in the Rye", summary: "A book about a kid" },
{ title: "The Da Vinci Code", summary: "A book about a code" },
{ title: "The Hobbit", summary: "A book about a hobbit" },
{ title: "Star Wars: The novel", summary: "A book about a galaxy far far away" },
{ title: "Lief klein konijn", summary: "Een boek over een konijntje" }
]const result = await collection.find({ title: /MongoDB/ }).toArray();const result = await collection.find({ title: /mongodb/i }).toArray();const search : string = "MongoDB";
const result : Book[] = await collection.find<Book>({ title: new RegExp(search, "i") }).toArray();await collection.createIndex({ title: "text" });const result = await collection.find({ $text: { $search: "MongoDB" } }).toArray();const result = await collection.find({ $text: { $search: "MongoDB database" } }).toArray();const result = await collection.find({ $text: { $search: "dummy" } }).toArray();const result = await collection.find({ $text: { $search: "the" } }).toArray();await collection.createIndex({ title: "text", summary: "text" });await collection.dropIndex("*")const result = await collection.find({ $text: { $search: "database" } }).toArray();const result = await collection.find({ $text: { $search: "konijnen", $language: "nl" } }).toArray();await collection.createIndex({ title: "text", summary: "text" }, { default_language: "none" });const result = await collection.updateMany({ age: { $lt: 18 } }, { $set: { age: 18 } });const result = await collection.updateOne({ name: "John" }, { $set: { age: 20 } }, {upsert: true} );const result = await collection.find({}).sort({ name: 1 }).toArray();const result = await collection.find({}).sort({ name: 1, age: -1 }).toArray();const result = await collection.find({}).sort({ name: 1 }).collation({ locale: "en" }).toArray();Apple
Grapefruit
bananaApple
banana
Grapefruitconst result = await collection.find({}).limit(5).toArray();const result = await collection.find({}).skip(5).limit(5).toArray();import { Collection, MongoClient } from "mongodb";
import dotenv from "dotenv";
import { User } from "./types";
dotenv.config();
export const client = new MongoClient(process.env.MONGODB_URI || "mongodb://localhost:27017");
export const collection : Collection<User> = client.db("exercises").collection<User>("users");
export async function getUsers() {
return await collection.find({}).toArray();
}
async function exit() {
try {
await client.close();
console.log("Disconnected from database");
} catch (error) {
console.error(error);
}
process.exit(0);
}
export async function loadUsersFromApi() {
const users : User[] = await getUsers();
if (users.length == 0) {
console.log("Database is empty, loading users from API")
const response = await fetch("https://jsonplaceholder.typicode.com/users");
const users : User[] = await response.json();
await collection.insertMany(users);
}
}
export async function connect() {
try {
await client.connect();
await loadUsersFromApi();
console.log("Connected to database");
process.on("SIGINT", exit);
} catch (error) {
console.error(error);
}
}import { connect } from "./database";
app.listen(3000, async () => {
await connect();
console.log("Server is running on port 3000");
});import { connect, getUsers } from "./database";app.get("/users", async(req, res) => {
let users : User[] = await getUsers();
res.render("users/index", {
users: users
});
});<%- include("../partials/header") %>
<section>
<header>
<h1>Manage Users</h1>
</header>
<% for (let user of users) { %>
<article>
<header>
<h2><%= user.name %></h2>
<p><strong>Username:</strong> <%= user.username %></p>
</header>
<p><strong>Email:</strong> <%= user.email %></p>
<address>
<strong>Address:</strong> <%= user.address.street %>, <%= user.address.suite %>, <%= user.address.city %>, <%= user.address.zipcode %>
</address>
<p><strong>Phone:</strong> <%= user.phone %></p>
<p><strong>Website:</strong> <a href="http://<%= user.website %>"><%= user.website %></a></p>
<p><strong>Company:</strong> <%= user.company.name %></p>
</article>
<% } %>
</section>
<%- include("../partials/footer") %><%- include("../partials/header") %>
<section>
<header>
<h1>Create User</h1>
</header>
<form action="/users/create" method="POST">
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
</div>
<div>
<label for="username">Username:</label>
<input type="text" id="username" name="username" required>
</div>
<div>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
</div>
<fieldset>
<legend>Address</legend>
<div>
<label for="street">Street:</label>
<input type="text" id="street" name="address[street]" required>
</div>
<div>
<label for="suite">Suite:</label>
<input type="text" id="suite" name="address[suite]">
</div>
<div>
<label for="city">City:</label>
<input type="text" id="city" name="address[city]" required>
</div>
<div>
<label for="zipcode">Zipcode:</label>
<input type="text" id="zipcode" name="address[zipcode]" required>
</div>
</fieldset>
<div>
<label for="phone">Phone:</label>
<input type="text" id="phone" name="phone" required>
</div>
<div>
<label for="website">Website:</label>
<input type="text" id="website" name="website">
</div>
<fieldset>
<legend>Company</legend>
<div>
<label for="companyName">Company Name:</label>
<input type="text" id="companyName" name="company[name]" required>
</div>
<div>
<label for="catchPhrase">Catch Phrase:</label>
<input type="text" id="catchPhrase" name="company[catchPhrase]">
</div>
<div>
<label for="bs">BS:</label>
<input type="text" id="bs" name="company[bs]">
</div>
</fieldset>
<button type="submit">Create User</button>
</form>
</section>
<%- include("../partials/footer") %>app.get("/users/create", async(req, res) => {
res.render("users/create");
});
app.post("/users/create", async(req, res) => {
let user : User = req.body;
await createUser(user);
res.redirect("/users");
});export async function getNextId() {
let users : User[] = await collection.find({}).sort({id: -1}).limit(1).toArray();
if (users.length == 0) {
return 1;
} else {
return users[0].id + 1;
}
}
export async function createUser(user: User) {
user.id = await getNextId();
return await collection.insertOne(user);
}import { connect, getUsers, createUser } from "./database";<% for (let user of users) { %>
...
<form action="/users/<%= user.id %>/delete" method="POST">
<button type="submit">Delete</button>
</form>
...
<% } %>app.post("/users/:id/delete", async(req, res) => {
let id : number = parseInt(req.params.id);
await deleteUser(id);
res.redirect("/users");
});export async function deleteUser(id: number) {
return await collection.deleteOne({id: id});
}import { connect, getUsers, createUser, deleteUser } from "./database";<%- include("../partials/header") %>
<section>
<header>
<h1>Update User</h1>
</header>
<form action="/users/<%= user.id %>/update" method="POST">
<div>
<label for="name">Name:</label>
<input type="text" id="name" name="name" value="<%= user.name %>" required>
</div>
<div>
<label for="username">Username:</label>
<input type="text" id="username" name="username" value="<%= user.username %>" required>
</div>
<div>
<label for="email">Email:</label>
<input type="email" id="email" name="email" value="<%= user.email %>" required>
</div>
<fieldset>
<legend>Address</legend>
<div>
<label for="street">Street:</label>
<input type="text" id="street" name="address[street]" value="<%= user.address.street %>" required>
</div>
<div>
<label for="suite">Suite:</label>
<input type="text" id="suite" name="address[suite]" value="<%= user.address.suite %>">
</div>
<div>
<label for="city">City:</label>
<input type="text" id="city" name="address[city]" value="<%= user.address.city %>" required>
</div>
<div>
<label for="zipcode">Zipcode:</label>
<input type="text" id="zipcode" name="address[zipcode]" value="<%= user.address.zipcode %>" required>
</div>
</fieldset>
<div>
<label for="phone">Phone:</label>
<input type="text" id="phone" name="phone" value="<%= user.phone %>" required>
</div>
<div>
<label for="website">Website:</label>
<input type="text" id="website" name="website" value="<%= user.website %>">
</div>
<fieldset>
<legend>Company</legend>
<div>
<label for="companyName">Company Name:</label>
<input type="text" id="companyName" name="company[name]" value="<%= user.company.name %>" required>
</div>
<div>
<label for="catchPhrase">Catch Phrase:</label>
<input type="text" id="catchPhrase" name="company[catchPhrase]" value="<%= user.company.catchPhrase %>">
</div>
<div>
<label for="bs">BS:</label>
<input type="text" id="bs" name="company[bs]" value="<%= user.company.bs %>">
</div>
</fieldset>
<button type="submit">Update User</button> <!-- Changed the button text to `Update User` -->
</form>
</section>
<%- include("../partials/footer") %>app.get("/users/:id/update", async(req, res) => {
let id : number = parseInt(req.params.id);
let user : User | null = await getUserById(id);
res.render("users/update", {
user: user
});
});
app.post("/users/:id/update", async(req, res) => {
let id : number = parseInt(req.params.id);
let user : User = req.body;
await updateUser(id, user);
res.redirect("/users");
});export async function getUserById(id: number) {
return await collection.findOne({ id: id });
}
export async function updateUser(id: number, user: User) {
return await collection.updateOne({ id : id }, { $set: user });
}import { connect, getUsers, createUser, deleteUser, getUserById, updateUser } from "./database";try catch finallyconst result = await collection.deleteOne({ name: "John" });import { MongoClient } from "mongodb";
const client = new MongoClient("mongodb://localhost:27017");
const app = express();
app.get("/students", async (req, res) => {
try {
await client.connect();
const db = client.db("example");
const students = await db.collection("student").find().toArray();
res.json(students);
} catch (error) {
console.error(error);
res.status(500).send("Internal server error");
} finally {
await client.close();
}
});import { MongoClient } from "mongodb";
export const client = new MongoClient("mongodb://localhost:27017");
async function exit() {
try {
await client.close();
console.log("Disconnected from database");
} catch (error) {
console.error(error);
}
process.exit(0);
}
export async function connect() {
try {
await client.connect();
console.log("Connected to database");
process.on("SIGINT", exit);
} catch (error) {
console.error(error);
}
}import express from "express";
import { connect } from "./database";
const app = express();
app.listen(3000, async () => {
await connect();
console.log("Server is running on port 3000");
});export const studentsCollection: Collection<Student> = client.db("example").collection<Student>("student");async function seed() {
const students : Student[] = [
{ name: "Alice", age: 20 },
{ name: "Bob", age: 21 },
{ name: "Charlie", age: 22 },
{ name: "David", age: 23 },
{ name: "Eve", age: 24 },
{ name: "Frank", age: 25 },
{ name: "Grace", age: 26 },
{ name: "Heidi", age: 27 },
{ name: "Ivan", age: 28 },
{ name: "Judy", age: 29 }
];
if (await studentsCollection.countDocuments() === 0) {
await studentsCollection.insertMany(students);
}
}export async function connect() {
try {
await client.connect();
console.log("Connected to database");
await seed();
process.on("SIGINT", exit);
} catch (error) {
console.error(error);
}
}import { studentsCollection } from "./database";app.get("/students", async (req, res) => {
const students = await studentsCollection.find().toArray();
res.json(students);
});export async function getStudents() {
return await studentsCollection.find().toArray();
}app.get("/students", async (req, res) => {
const students = await getStudents();
res.json(students);
});import { ObjectId } from "mongodb";
export interface Student {
_id?: ObjectId;
name: string;
age: number;
}import { Collection, MongoClient } from "mongodb";
import { Student } from "./types";
export const client = new MongoClient("mongodb://localhost:27017");
export const studentsCollection: Collection<Student> = client.db("example").collection<Student>("student");
async function exit() {
try {
await client.close();
console.log('Disconnected from database');
} catch (error) {
console.error(error);
}
process.exit(0);
}
async function seed() {
const students : Student[] = [
{ name: "Alice", age: 20 },
{ name: "Bob", age: 21 },
{ name: "Charlie", age: 22 },
{ name: "David", age: 23 },
{ name: "Eve", age: 24 },
{ name: "Frank", age: 25 },
{ name: "Grace", age: 26 },
{ name: "Heidi", age: 27 },
{ name: "Ivan", age: 28 },
{ name: "Judy", age: 29 }
];
if (await studentsCollection.countDocuments() === 0) {
await studentsCollection.insertMany(students);
}
}
async function getStudents() {
return await studentsCollection.find().toArray();
}
export async function connect() {
try {
await client.connect();
await seed();
console.log('Connected to database');
process.on('SIGINT', exit);
} catch (error) {
console.error(error);
}
}import express, { Express } from "express";
import path from "path";
import { connect, getStudents } from "./database";
const app : Express = express();
app.set("view engine", "ejs");
app.set('views', path.join(__dirname, "views"));
app.set("port", 3000);
app.get("/students", async (req, res) => {
let books = await getStudents();
res.json(books);
});
app.listen(app.get("port"), async() => {
await connect();
console.log("Server started on http://localhost:" + app.get('port'));
});MONGO_URI=mongodb://localhost:27017export const client = new MongoClient(process.env.MONGO_URI);const result = await collection.deleteMany({ age: { $lt: 18 } });const result = await collection.deleteMany({});import bcrypt from 'bcrypt';
const saltRounds : number = 10;
async function main() : Promise<string> {
let hashedPassword : string = await bcrypt.hash("hunter2", saltRounds);
console.log(hashedPassword);
}
main();let hashedPassword1 : string = await bcrypt.hash("hunter2", saltRounds);
let hashedPassword2 : string = await bcrypt.hash("hunter2", saltRounds);
console.log(hashedPassword1 === hashedPassword2); // falseimport bcrypt from 'bcrypt';
const saltRounds : number = 10;
async function main() : Promise<boolean> {
let hashedPassword : string = await bcrypt.hash("hunter2", saltRounds);
let isSame : boolean = await bcrypt.compare("hunter2", hashedPassword);
console.log(isSame); // true
}
main();sha256sum vscode-windows-x64.zipGet-FileHash vscode-windows-x64.zip -Algorithm SHA256
PORT=3000 node server.tsconsole.log( process.env.PORT)const port = process.env.PORT || 3000;
console.log(port);PORT=3000
MONGO_URI=mongodb://localhost:27017npm install dotenvimport dotenv from "dotenv";
dotenv.config();
console.log(process.env.PORT);
console.log(process.env.MONGO_URI);.envimport express, { Express } from "express";
import dotenv from "dotenv";
import path, { format } from "path";
dotenv.config();
const app : Express = express();
app.set("view engine", "ejs");
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, "public")));
app.set('views', path.join(__dirname, "views"));
app.set("port", process.env.PORT || 3000);
app.get("/", async(req, res) => {
res.render("index");
});
app.listen(app.get("port"), () => {
console.log("Server started on http://localhost:" + app.get('port'));
});npm install express dotenv ejsnpm install mongodbimport { ObjectId } from "mongodb";
export interface User {
_id?: ObjectId;
email: string;
password?: string;
role: "ADMIN" | "USER";
}import dotenv from "dotenv";
dotenv.config();
import { MongoClient } from "mongodb";
import { User } from "./types";
export const MONGODB_URI = process.env.MONGODB_URI ?? "mongodb://localhost:27017";
export const client = new MongoClient(MONGODB_URI);
export const userCollection = client.db("login-express").collection<User>("users");
async function exit() {
try {
await client.close();
console.log("Disconnected from database");
} catch (error) {
console.error(error);
}
process.exit(0);
}
export async function connect() {
await client.connect();
console.log("Connected to database");
process.on("SIGINT", exit);
}MONGODB_URI=mongodb://localhost:27017import { connect } from "./database";app.listen(app.get("port"), async() => {
try {
await connect();
console.log("Server started on http://localhost:" + app.get('port'));
} catch (e) {
console.log(e);
process.exit(1);
}
});ADMIN_EMAIL=dummy@ap.be
ADMIN_PASSWORD=adminnpm install bcrypt
npm install --save-dev @types/bcryptimport bcrypt from "bcrypt";async function createInitialUser() {
if (await userCollection.countDocuments() > 0) {
return;
}
let email : string | undefined = process.env.ADMIN_EMAIL;
let password : string | undefined = process.env.ADMIN_PASSWORD;
if (email === undefined || password === undefined) {
throw new Error("ADMIN_EMAIL and ADMIN_PASSWORD must be set in environment");
}
await userCollection.insertOne({
email: email,
password: await bcrypt.hash(password, saltRounds),
role: "ADMIN"
});
}await createInitialUser();const saltRounds : number = 10;export async function login(email: string, password: string) {
if (email === "" || password === "") {
throw new Error("Email and password required");
}
let user : User | null = await userCollection.findOne<User>({email: email});
if (user) {
if (await bcrypt.compare(password, user.password!)) {
return user;
} else {
throw new Error("Password incorrect");
}
} else {
throw new Error("User not found");
}
}<%- include("partials/header") %>
<form action="/login" method="post">
<div class="form-group">
<label for="email">Email:</label>
<input type="email" id="email" name="email"/>
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" id="password" name="password"/>
</div>
<button type="submit">Login</button>
</form>
<%- include("partials/footer") %>app.get("/login", (req, res) => {
res.render("login");
});npm install express-session
npm install --save-dev @types/express-sessionnpm install connect-mongoimport { MONGODB_URI } from "./database";
import session, { MemoryStore } from "express-session";
import { User } from "./types";
import MongoStore from 'connect-mongo'
const mongoStore = MongoStore.create({
mongoUrl: MONGODB_URI,
dbName: "sessions",
collectionName: "login-express"
});
mongoStore.on("error", (error) => {
console.error(error);
});
declare module 'express-session' {
export interface SessionData {
user?: User
}
}
export default session({
secret: process.env.SESSION_SECRET ?? "my-super-secret-secret",
store: mongoStore,
resave: true,
saveUninitialized: true,
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 7, // 1 week
}
});import session from "./session";
app.use(session);app.post("/login", async(req, res) => {
const email : string = req.body.email;
const password : string = req.body.password;
try {
let user : User = await login(email, password);
delete user.password; // Paswoord mag nooit in de sessie
req.session.user = user;
res.redirect("/")
} catch (e : any) {
res.redirect("/login");
}
});<%- include("partials/header") %>
<%= user.email %> is logged in
<%- include("partials/footer") %>app.get("/", async(req, res) => {
res.render("index");
});app.get("/", async(req, res) => {
if (req.session.user) {
res.render("index", {user: req.session.user});
} else {
res.redirect("/login");
}
});import { NextFunction, Request, Response } from "express";
export function secureMiddleware(req: Request, res: Response, next: NextFunction) {
if (req.session.user) {
res.locals.user = req.session.user;
next();
} else {
res.redirect("/login");
}
};import { secureMiddleware } from "./secureMiddleware";
app.get("/", secureMiddleware, async(req, res) => {
res.render("index", { user: req.session.user });
});app.post("/logout", async(req, res) => {
req.session.destroy(() => {
res.redirect("/login");
});
});<%- include("partials/header") %>
<%= user.email %> is logged in.
<form action="/logout" method="post">
<button type="submit">Logout</button>
</form>
<%- include("partials/footer") %>import express from "express";
export function loginRouter() {
const router = express.Router();
router.get("/login", async (req, res) => {
res.render("login");
});
router.post("/login", async (req, res) => {
const email: string = req.body.email;
const password: string = req.body.password;
try {
let user: User = await login(email, password);
delete user.password; // Remove password from user object. Sounds like a good idea.
req.session.user = user;
res.redirect("/")
} catch (e: any) {
res.redirect("/login");
}
});
router.post("/logout", secureMiddleware, async (req, res) => {
req.session.destroy((err) => {
res.redirect("/login");
});
});
return router;
}import express from "express";
export function homeRouter() {
const router = express.Router();
router.get("/", async(req, res) => {
res.render("index");
});
return router;
}import { loginRouter } from "./routes/loginRouter";
import { homeRouter } from "./routes/homeRouter";
app.use(loginRouter());
app.use(homeRouter());export interface FlashMessage {
type: "error" | "success"
message: string;
}export interface SessionData {
user?: User;
message?: FlashMessage;
}import { NextFunction, Request, Response } from "express";
export function flashMiddleware(req: Request, res: Response, next: NextFunction) {
if (req.session.message) {
res.locals.message = req.session.message;
delete req.session.message;
} else {
res.locals.message = undefined;
}
next();
};import { flashMiddleware } from "./flashMiddleware";
app.use(flashMiddleware);req.session.message = {type: "error", message: e.message};
res.redirect("/login");req.session.message = {type: "success", message: "Login successful"};
res.redirect("/");<% if (message) { %>
<p class="<%= message.type %>"><%= message.message %></p>
<% } %>import dotenv from "dotenv";
dotenv.config();
import session, { MemoryStore } from "express-session";
declare module 'express-session' {
export interface SessionData {
// All session properties should be defined here
}
}
export default session({
secret: process.env.SESSION_SECRET ?? "my-super-secret-secret",
store: new MemoryStore(),
resave: true,
saveUninitialized: true,
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 7, // 1 week
}
});import session from "./session";app.use(session);declare module 'express-session' {
export interface SessionData {
username?: string;
}
}req.session.username = "JohnDoe";const username = req.session.username;
console.log(username);req.session.destroy(() => {
console.log("Sessie verwijderd");
});npm install connect-mongoimport dotenv from "dotenv";
dotenv.config();
import session from "express-session";
import MongoStore from 'connect-mongo'
const mongoStore = MongoStore.create({
mongoUrl: process.env.MONGODB_URI ?? "mongodb://localhost:27017",
dbName: "sessions",
collectionName: "webontwikkeling"
});
mongoStore.on("error", (error) => {
console.error(error);
});
declare module 'express-session' {
export interface SessionData {
username?: string;
}
}
export default session({
secret: process.env.SESSION_SECRET ?? "my-super-secret-secret",
store: mongoStore,
resave: false,
saveUninitialized: false,
});interface Product {
name: string;
price: number;
}declare module 'express-session' {
export interface SessionData {
cart?: Product[];
}
}let items: Product[] = [
{name: "Apple", price: 1},
{name: "Banana", price: 2},
{name: "Cherry", price: 3},
{name: "Orange", price: 2},
{name: "Raspberry", price: 4},
{name: "Strawberry", price: 1},
{name: "Watermelon", price: 5},
];app.get("/cart", (req, res) => {
let add : string = typeof req.query.add === "string" ? req.query.add : "";
let cart: Product[] = req.session.cart ? req.session.cart : [];
let addProduct : Product | undefined = items.find(product => product.name === add);
if (addProduct) {
if (add) {
cart.push(addProduct);
req.session.cart = cart;
}
}
res.render("cart", {
items: items,
cart: cart
})
});
let result: Pokemon | null = await client.db("Les").collection("pokemon").findOne<Pokemon>({_id: new ObjectId("5f3b3b3b3b3b3b3b3b3b3b3b")});
console.log(result);import { MongoClient, ObjectId } from "mongodb";let cursor = client.db("Les").collection("pokemon").find<Pokemon>({});
let result = await cursor.toArray();
console.log(result);import { MongoClient, ObjectId } from "mongodb";
const uri = "mongodb+srv://<username>:<password>@<your-cluster-url>/test?retryWrites=true&w=majority";
const client = new MongoClient(uri);
interface Pokemon {
_id?: ObjectId,
name: string,
age: number
}
async function main() {
try {
// Connect to the MongoDB cluster
await client.connect();
let pikachu: Pokemon = { name:"pikachu", age:12 };
const result = await client.db("Les").collection("pokemon").insertOne(pikachu);
console.log(`New document created with the following id: ${result.insertedId}`);
let cursor = client.db("Les").collection("pokemon").find<Pokemon>({});
let pokemons = await cursor.toArray();
console.log(pokemons);
} catch (e) {
console.error(e);
} finally {
await client.close();
}
}Securenpm install cookie-parser
npm install --save-dev @types/cookie-parserimport cookieParser from "cookie-parser";
const app = express();
app.use(cookieParser());app.get("/", (req, res) => {
res.render("index");
});
app.post("/", (req, res) => {
res.cookie("username", req.body.username);
res.redirect("/profile");
});<form action="/" method="post">
<input type="text" name="username" />
<button type="submit">Submit</button>
</form>app.get("/profile", (req, res) => {
let name: string = req.cookies.username;
res.render("profile", { username: name });
});<h1>Welcome <%= username %></h1>app.get("/removeName", (req, res) => {
res.clearCookie("username");
res.redirect("/");
});<a href="/removeName">Remove name</a>res.cookie("username", req.body.username, { expires: new Date(Date.now() + 900000) });res.cookie("username", req.body.username, { maxAge: 900000 });res.cookie("username", req.body.username, { httpOnly: true });document.cookie = "username=John Doe";console.log(document.cookie)res.cookie("username", req.body.username, { secure: true });res.cookie("username", req.body.username, { sameSite: "strict" });let items: string[] = [
"Apple",
"Banana",
"Cherry",
"Orange",
"Raspberry",
"Strawberry",
"Watermelon",
];
app.get("/cart", (req, res) => {
let add : string = typeof req.query.add === "string" ? req.query.add : "";
let cart: string[] = req.cookies.cart ? JSON.parse(req.cookies.cart) : [];
if (add) {
cart.push(add);
res.cookie("cart", JSON.stringify(cart));
}
res.render("cart", {
items: items,
cart: cart
})
});<h1>Shop</h1>
<ul>
<% for (let item of items) { %>
<li><a href="/cart?add=<%= item %>">Add <%= item %></a></li>
<% } %>
</ul>
<h1>Cart</h1>
<ul>
<% for (let item of cart) { %>
<li><%= item %></li>
<% } %>
</ul>interface UserSettings {
theme: "dark" | "light";
language: "NL" | "EN" | "FR";
}app.get("/settings", (req, res) => {
const settings : UserSettings = req.cookies.settings ? JSON.parse(req.cookies.settings) : { darkMode: false, language: "EN" };
res.render("settings", {
settings
});
});
app.post("/settings", (req, res) => {
const settings : UserSettings = {
theme: req.body.theme,
language: req.body.language
};
res.cookie("settings", JSON.stringify(settings));
res.redirect("/settings");
});<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/css/style.css">
<% if (settings.theme === "dark") { %>
<style>
body {
background-color: black;
color: white;
}
</style>
<% } else if (settings.theme === "light") { %>
<style>
body {
background-color: white;
color: black;
}
</style>
<% } %>
</head>
<body>
<% if (settings.language === "NL") { %>
<h1>Instellingen</h1>
<% } else if (settings.language === "EN") { %>
<h1>Settings</h1>
<% } else if (settings.language === "FR") { %>
<h1>Paramètres</h1>
<% } %>
<form action="/settings" method="POST">
<select name="language">
<option <%= settings.language === 'NL' ? "selected" : ""%>>NL</option>
<option <%= settings.language === 'EN' ? "selected" : ""%>>EN</option>
<option <%= settings.language === 'FR' ? "selected" : ""%>>FR</option>
</select>
<select name="theme">
<option value="dark" <%= settings.theme === "dark" ? "selected" : "" %>>Dark</option>
<option value="light" <%= settings.theme === "light" ? "selected" : "" %>>Light</option>
</select>
<button type="submit">Save</button>
</form>
</html>




header.payload.signature{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "1234567890",
"name": "AP user",
"iat": "1516239022"
}HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)



npm i --save-dev jest ts-jest @types/jestnpx ts-jest config:init"scripts": {
"test": "jest"
}"types": ["jest", "node"]export function toUpperFunction(input: string): string {
let chars: string = "";
for (let char of input) {
const code = char.charCodeAt(0);
if (code >= 97 && code <= 122) { // Checking if the character is a lowercase letter
chars += String.fromCharCode(code - 32); // Converting to uppercase
} else {
chars += char; // Adding non-lowercase characters unchanged
}
}
return chars;
}import { toUpperFunction } from "./string-utils";
describe("toUpperFunction", () => {
it("should convert a string to uppercase", () => {
expect(toUpperFunction("hello")).toBe("HELLO");
});
it("should not convert a string that is already uppercase", () => {
expect(toUpperFunction("HELLO")).toBe("HELLO");
});
it("should not convert a string that is not a letter", () => {
expect(toUpperFunction("123")).toBe("123");
});
});PASS ./string-utils.test.ts
toUpperFunction
✓ should convert a string to uppercase (2 ms)
✓ should not convert a string that is already uppercase
✓ should not convert a string that is not a letterit("should convert a string with umlauts to uppercase", () => {
expect(toUpperFunction("äöü")).toBe("ÄÖÜ");
});export function toUpperFunction(input: string): string {
return input.toUpperCase();
}export function calculateSquareRoot(num: number): number {
if (num < 0) {
throw new Error("Cannot calculate the square root of a negative number.");
}
return Math.sqrt(num);
}import { calculateSquareRoot } from "./math-utils";
describe("calculateSquareRoot", () => {
it("should calculate the square root of a positive number", () => {
expect(calculateSquareRoot(4)).toBe(2);
});
it("should throw an error when calculating the square root of a negative number", () => {
expect(() => calculateSquareRoot(-4)).toThrow("Cannot calculate the square root of a negative number.");
});
});export async function fetchUser(id: number): Promise<string> {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (id === 1) {
resolve("John Doe");
} else {
reject(new Error("User not found"));
}
}, 1000);
});
}import { fetchUser } from "./user-service";
describe("fetchUser", () => {
it("should fetch a user by id", async () => {
const user = await fetchUser(1);
expect(user).toBe("John Doe");
});
it("should throw an error when the user is not found", async () => {
try {
await fetchUser(2);
} catch (error: any) {
expect(error.message).toBe("User not found");
}
});
});beforeAll(() => {
console.log("Before all tests");
});
beforeEach(() => {
console.log("Before each test");
});
afterEach(() => {
console.log("After each test");
});
afterAll(() => {
console.log("After all tests");
});npm i --save-dev supertest @types/supertestimport express from "express";
const app = express();
app.get("/hello", (req, res) => {
res.send("Hello, world!");
});
app.listen(3000, () => {
console.log("Server is running on http://localhost:3000");
});
export default app;import request from "supertest";
import app from "./index";
describe("GET /hello", () => {
it("should return Hello, world!", async () => {
const response = await request(app).get("/hello");
expect(response.status).toBe(200);
expect(response.text).toBe("Hello, world!");
});
});Jest did not exit one second after the test run has completed.
'This usually means that there are asynchronous operations that weren't stopped in your tests. Consider running Jest with `--detectOpenHandles` to troubleshoot this issue.import app from "./app";
app.listen(3000, () => {
console.log("Server is running on http://localhost:3000");
});import express from "express";
const app = express();
app.get("/hello", (req, res) => {
res.send("Hello, world!");
});
export default app;app.get("/hello", (req, res) => {
const name = req.query.name;
res.send(`Hello, ${name}!`);
});describe("GET /hello", () => {
it("should return Hello, world!", async () => {
const response = await request(app).get("/hello").query({ name: "world" });
expect(response.status).toBe(200);
expect(response.text).toBe("Hello, world!");
});
it("should return Hello, John!", async () => {
const response = await request(app).get("/hello").query({ name: "John" });
expect(response.status).toBe(200);
expect(response.text).toBe("Hello, John!");
});
});app.post("/hello", (req, res) => {
const name = req.body.name;
res.send(`Hello, ${name}!`);
});describe("POST /hello", () => {
it("should return Hello, world!", async () => {
const response = await request(app).post("/hello").send({ name: "world" });
expect(response.status).toBe(200);
expect(response.text).toBe("Hello, world!");
});
it("should return Hello, John!", async () => {
const response = await request(app).post("/hello").send({ name: "John" });
expect(response.status).toBe(200);
expect(response.text).toBe("Hello, John!");
});
});app.get("/hello", (req, res) => {
res.send("<h1>Hello, world!</h1>");
});describe("GET /hello", () => {
it("should return Hello, world!", async () => {
const response = await request(app).get("/hello");
expect(response.status).toBe(200);
expect(response.text).toBe("<h1>Hello, world!</h1>");
});
});import { parse } from "node-html-parser";
describe("GET /hello", () => {
it("should return Hello, world!", async () => {
const response = await request(app).get("/hello");
expect(response.status).toBe(200);
const root = parse(response.text);
const h1 = root.querySelector("h1");
if (h1) {
expect(h1.innerText).toBe("Hello, world!");
}
});
});"scripts": {
"coverage": "jest --coverage"
}app.get("/pets", async (req, res) => {
let pets : Pet[] = await getPets();
res.render("pets", { pets });
});import { ObjectId } from "mongodb"
export interface Pet {
_id?: ObjectId,
name: string,
age: number,
type: PetType,
breed: string
}
export type PetType = "dog" | "cat" | "hamster"import {Collection, MongoClient} from "mongodb";
import dotenv from "dotenv";
import { Pet, PetType } from "./types";
dotenv.config();
if (!process.env.MONGODB_URI) {
process.exit(0);
}
const client = new MongoClient(process.env.MONGODB_URI);
const petCollection: Collection<Pet> = client.db("pet-shelter").collection("pets");
export async function getPets() {
return await petCollection.find().sort({"name": "asc"}).toArray();
}
export async function seed() {
if (await petCollection.countDocuments() === 0) {
const pets: Pet[] = [
{ name: "Buddy", age: 2, type: "dog", breed: "Golden Retriever" },
{ name: "Daisy", age: 3, type: "dog", breed: "Beagle" },
// ...
];
console.log("No data... seeding");
await petCollection.insertMany(pets);
}
}
export async function connect() {
await client.connect();
console.log("Connected to database");
await seed();
}
export async function close() {
try {
await client.close()
} catch (e) {
console.error(e);
}
}import request from "supertest";
import app from "./app";
import { getPets } from "./database";
import { ObjectId, WithId } from "mongodb";
import { Pet } from "./types";
jest.mock("./database");
const mockGetPets = jest.mocked(getPets);
const mockPets : WithId<Pet>[] = [
{ _id: new ObjectId("65f1a1b2c3d4e5f6a1b2c3d4"), name: "Buddy", age: 2, type: "dog", breed: "Golden Retriever" },
{ _id: new ObjectId("65f1a1b2c3d4e5f6a1b2c3d5"), name: "Daisy", age: 3, type: "dog", breed: "Beagle" },
];
describe("GET /pets", () => {
it("should return 200 and render the list of pets", async () => {
// Arrange
mockGetPets.mockResolvedValue(mockPets);
// Act
const res = await request(app).get("/pets");
// Assert
expect(res.status).toBe(200);
expect(res.text).toContain("Buddy");
expect(res.text).toContain("Daisy");
expect(mockGetPets).toHaveBeenCalledTimes(1);
});
it("should return 200 even if the pet list is empty", async () => {
// Arrange
mockGetPets.mockResolvedValue([]);
// Act
const res = await request(app).get("/pets");
// Assert
expect(res.status).toBe(200);
expect(mockGetPets).toHaveBeenCalled();
});
it("should handle database errors gracefully", async () => {
// Arrange
mockGetPets.mockRejectedValue(new Error("Database connection failed"));
// Act
const res = await request(app).get("/pets");
// Assert
expect(res.status).toBe(500);
});
});npm install --save-dev @fetch-mock/jestinterface Pokemon {
name: string,
url: string,
}
app.get("/pokemon", async (req: Request, res: Response) => {
const response = await fetch("https://pokeapi.co/api/v2/pokemon?limit=2");
const pokemon = (await response.json()).results as Pokemon[];
res.render("pokemon", { names: pokemon.map(({name}) => name) });
});import request from "supertest";
import fetchMock from "@fetch-mock/jest";
import app from "./index";
const POKE_API_URL = "https://pokeapi.co/api/v2/pokemon?limit=2";
beforeEach(() => {
fetchMock.mockGlobal();
});
afterEach(() => {
fetchMock.mockRestore();
});
describe("GET /pokemon", () => {
it("renders pokemon names from the API", async () => {
// Arrange
fetchMock.get(POKE_API_URL, {
results: [
{ name: "bulbasaur", url: "https://pokeapi.co/api/v2/pokemon/1/" },
{ name: "ivysaur", url: "https://pokeapi.co/api/v2/pokemon/2/" },
],
});
// Act
const res = await request(app).get("/pokemon");
// Assert
expect(res.status).toBe(200);
expect(res.text).toContain("bulbasaur");
expect(res.text).toContain("ivysaur");
expect(fetchMock).toHaveFetched(POKE_API_URL);
});
});
afterEach(() => jest.clearAllMocks());app.get('/lezen', async (req, res) => {
try {
const data = await readFile('somepath.txt', 'utf-8');
res.send(data);
} catch (err) {
res.status(500).send('Error');
}
});import request from 'supertest';
import { readFile } from 'fs/promises';
import app from './index';
jest.mock('fs/promises');
const mockedReadFile = jest.mocked(readFile);
describe('GET /lezen', () => {
afterEach(() => {
jest.clearAllMocks();
});
it('geeft de tekst terug bij succes', async () => {
// Arrange
mockedReadFile.mockResolvedValue('Mock data!');
// Act
const res = await request(app).get('/lezen');
// Assert
expect(res.text).toBe('Mock data!');
expect(mockedReadFile).toHaveBeenCalledTimes(1);
});
it('geeft een 500 bij een fout', async () => {
// Arrange
mockedReadFile.mockRejectedValue(new Error('File not found'));
// Act
const res = await request(app).get('/lezen');
// Assert
expect(res.status).toBe(500);
expect(mockedReadFile).toHaveBeenCalledTimes(1);
});
});
workspaces
└── Deel1-Node-en-Typescript
├── node_modules
├── src
│ ├── dir1
│ │ └── file1.ts
└── tooling





wsl --versionWSL version: 2.4.10.0
Kernel version: 5.15.167.4
WSLg version: 1.0.65
MSRDC version: 1.2.5620
Direct3D version: 1.611.1-81528511
DXCore version: 10.0.26100.1-240331-1435.ge-release
Windows version: 10.0.26100.3037wsl --updatewsl --install --no-distributiondism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
wsl --set-default-version 2
wsl --update



import * as readline from 'readline-sync';let name = readline.question("What's your name? ");
console.log(`Hello ${name}!`);let age : number = Number(readline.question("What's your age? "));
console.log(`You are ${age} years old.`);import * as readline from 'readline-sync';
let age : number | undefined = undefined;
do {
age = Number(readline.question("What's your age? "));
if (isNaN(age)) {
console.log("Input valid number, please.");
}
} while (isNaN(age))
console.log(`You are ${age} years old.`);let age : number = readline.questionInt("What's your age? ");
console.log(`You are ${age} years old.`);What's your age? Test
Input valid number, please.
What's your age? 3
You are 3 years old.let age : number = readline.questionInt("What's your age? ", {limitMessage: "I only like numbers!"});
console.log(`You are ${age} years old.`);let price : number = readline.questionFloat("What's the price? ");
console.log(`The price is ${price} euro.`);let answer : boolean = readline.keyInYNStrict("Do you like TypeScript? ");
if (answer) {
console.log("Me too!");
} else {
console.log("Too bad!");
}let choices : string[] = ["TypeScript", "JavaScript", "Python", "Java", "C#"];
let index : number = readline.keyInSelect(choices, "What's your favorite programming language? ");
console.log(`You chose ${choices[index]}.`);[1] TypeScript
[2] JavaScript
[3] Python
[4] Java
[5] C#
[0] CANCEL
What's your favorite programming language? [1...5 / 0]: let andie = {
name: "Andie",
age: 40
}let debbie = {
naem: "Debbie",
age: 30
}interface Person {
name: string;
age: number;
}let andie: Person = {
name: "Andie",
age: 40
}let debbie: Person = {
naem: "Debbie",
age: 30
} // Error: Property 'naem' does not exist on type 'Person'let debbie: Person = {
name: "Debbie",
age: 30,
isAdmin: true
} // Error: Object literal may only specify known properties, and 'isAdmin' does not exist in type 'Person'let debbie: Person = {
name: "Debbie"
} // Error: Property 'age' is missing in type '{ name: string; }' but required in type 'Person'let debbie: Person = {
name: "Debbie",
age: "30"
} // Error: Type 'string' is not assignable to type 'number'interface User {
name: string,
age?: number,
address: Address
}interface Address {
street: string,
number: number,
city: string
}let user : User = {
name: "Andie",
age: 30,
address: {
street: "Fakestreet",
number: 133,
city: "Fakegem"
}
}console.log(user.address.street);interface User {
name: string,
age?: number,
address?: Address
}if (user.address) {
console.log(user.address.street);
}console.log(user.address.street); // Error: Object is possibly 'undefined'{
"Andie": "+32 123 45 67 89",
"Debbie": "+32 987 65 43 21"
}interface PhoneBook {
"Andie": string,
"Debbie": string
}
const phoneBook: PhoneBook = {
"Andie": "+32 123 45 67 89",
"Debbie": "+32 987 65 43 21"
}phoneBook["Charlie"] = "+32 123 45 67 89";interface PhoneBook {
"Andie": string,
"Debbie": string,
"Charlie": string
}let phoneBook: Record<string, string> = {
"Andie": "+32 123 45 67 89",
"Debbie": "+32 987 65 43 21"
}let count: Record<string, number> = {};
let values = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5];
for (let value of values) {
if (count[value]) {
count[value]++;
} else {
count[value] = 1;
}
}
console.log(count); // { '1': 3, '2': 3, '3': 3, '4': 3, '5': 3 }[
{
"name": "Andie",
"age": 30,
"address": {
"street": "Fakestreet",
"number": 133,
"city": "Fakegem"
}
},
{
"name": "Debbie",
"age": 25,
"address": {
"street": "Fakestreet",
"number": 133,
"city": "Fakegem"
}
}
]import data from "./users.json";{
"compilerOptions": {
...
"resolveJsonModule": true
...
}
}const users: User[] = data as User[]interface User {
name: string,
age: number,
address?: Address
}
let user : User = {
name: "Andie",
age: 30
}
console.log(user.address.street); // Error: Object is possibly 'undefined'console.log(user.address?.street); // undefinedconsole.log(user.address?.street?.number?.toString()); // undefinedfunction getDefaultUser() : User {
return {
name: "Default",
age: 0,
address: {
street: "Defaultstreet",
number: 0,
city: "Defaultcity"
}
}
}let defaultUser = getDefaultUser();
console.log(defaultUser.address.street); // Error: Object is possibly 'undefined'console.log(defaultUser.address!.street); // Defaultstreetlet data = "Hello World";
let data2 = data as string;let data = "Hello World";
let data2 = data as number;
console.log(data2.toFixed(2)); let thing = "My Message";
thing = "Another Message!"; // OK!
thing = 0; // Niet OK!let thing = 0;
thing = 5; // OK!
thing = "My Message"; // Niet OK!let a : number = 0;console.log(1/0); // Infinityconsole.log( "not a number" / 2 );let str : string = "Hello";
let str2 : string = 'Single quotes are ok too';
let phrase : string = `can embed another ${str}`;let name : string = "Andie";
// met een variable
console.log( `Hello, ${name}!` ); // Hello, Andie!
// met een expression
console.log( `the result is ${1 + 2}` ); // the result is 3let number : number = 4;
let str : string = number.toString();let isLightOn : boolean = true;let isGroterDan : boolean = 4 > 1;
console.log(isGroterDan) // truelet a = 0; // a is van het type number
let b = "Hello"; // b is van het type string\let collegeDegree = null;let message;
console.log(message); // undefinedlet notSure: any = 4;
notSure = "maybe a string instead";
notSure = false;let value: unknown;
value = 10; // geldig
value = "Hello"; // geldig
value = true; // geldig
let num: number;
num = value; // Error: Type 'unknown' is not assignable to type 'number'
// Je moet het type eerst controleren of omzetten:
if (typeof value === "number") {
num = value; // Dit is nu geldig omdat we het type hebben gecontroleerd
}let id : number | string = 1;
id = "123e4567-e89b-12d3-a456-426614174000";let id : number | undefined = undefined;let lightStatus : "ON" | "DIMMED" | "OFF" = "ON";
lightStatus = "DIMMED"; // OK
lightStatus = "OFF"; // OK
lightStatus = "ON"; // OK
lightStatus = "BROKEN"; // FOUTtype LightStatus = "ON" | "DIMMED" | "OFF";
let lightStatus : LightStatus = "ON";
lightStatus = "DIMMED"; // OK
...let lightStatusStr : LightStatus = readline.question("status");Type 'string' is not assignable to type 'LightStatus'.let lightStatusStr : string = readline.question("status");
if (lightStatusStr === "ON" || lightStatusStr === "DIMMED" || lightStatusStr === "OFF") {
let lightStatus : LightStatus = lightStatusStr;
} else {
console.log("Invalid status");
}console.log(parseInt("1")) // 1
console.log(parseInt("getal")); // NaNgit config --global user.name "Jouw Naam"
git config --global user.email "Jouw Email"git add README.mdgit add nieuw_bestand.mdgit add -Agit add .git statusOn branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
new file: nieuw_bestand.mdgit commit -m "Eerste commit"git pushlet numbers : number[];let numbers : number[] = [];let numbers : number[] = [1,2,3,4,5];let fruits : string[] = ["Banana","Apple","Orange"];
console.log(fruits[0]); // Banana
console.log(fruits[1]); // Apple
console.log(fruits[2]); // Orangeconsole.log(fruits[3]); // undefinedfruits[2] = "Pear";fruits[3] = "Kiwi";let fruits : string[] = ["Banana","Apple","Orange"];
console.log(fruits.length); // 3let fruits : string[] = ["Banana","Apple","Orange"];
console.log(fruits); // [ 'Banana', 'Apple', 'Orange' ]let fruits : string[] = ["Banana","Apple","Orange"];
for (let i : number = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}let fruits : string[] = ["Banana","Apple","Orange"];
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}let fruits : string[] = ["Banana","Apple","Orange"];
for (let fruit of fruits) {
console.log(fruit);
}let matrix : number[][] = [
[1,2,3],
[4,5,6],
[7,8,9]
];console.log(matrix[0][0]); // 1let starterPokemon : string[][] = [
["Bulbasaur","Charmander","Squirtle"],
["Chikorita","Cyndaquil","Totodile"],
["Treecko","Torchic","Mudkip"]
];for (let i=0;i<starterPokemon.length;i++) {
console.log(`Generation ${i+1}:`);
for (let j=0;j<starterPokemon[i].length;j++) {
console.log(starterPokemon[i][j])
}
}const coordinate: [number, number] = [50,3];console.log(coordinate[0]);
console.log(coordinate[1]);let country : [string, number, number] = [
"Rotterdam", 51.926517, 4.462456
];let countries : [string, number, number][] = [
["Rotterdam", 51.926517, 4.462456],
["Amsterdam", 52.374021, 4.88969],
["Utrecht", 52.0908, 5.1214],
["Antwerpen", 51.227741, 4.402465],
["Brussel", 50.85467, 4.351697],
["Gent", 51.05, 3.7167]
];for (let country of countries) {
console.log(`${country[0]} ${country[1]} ${country[2]}`)
}function multiply(number1: number, number2: number): Promise<number> {
return new Promise<number>((resolve, reject) => {
setTimeout(() => {
resolve(number1 * number2);
}, 1000);
});
};multiply(2, 2).then((result) => {
multiply(result, 5).then((result) => {
console.log(result);
});
});multiply(2, 2).then((result) => {
multiply(result, 5).then((result) => {
multiply(result, 10).then((result) => {
console.log(result);
});
});
});let result : number = await multiply(2, 2);
result = await multiply(result, 5);
result = await multiply(result, 10);
console.log(result);async function main() {
let result : number = await multiply(2, 2);
result = await multiply(result, 5);
result = await multiply(result, 10);
console.log(result);
}
main();(async () => {
let result : number = await multiply(2, 2);
result = await multiply(result, 5);
result = await multiply(result, 10);
console.log(result);
})();try {
let result : number = await multiply(2, 2);
result = await multiply(result, 5);
result = await multiply(result, 10);
console.log(result);
} catch (error) {
console.log(error);
}import { readFile, writeFile } from "fs/promises";
readFile("getal1.txt", "utf-8").then((getal1) => {
readFile("getal2.txt", "utf-8").then((getal2) => {
multiply(parseInt(getal1), parseInt(getal2)).then((result) => {
writeFile("resultaat.txt", result.toString(), "utf-8").then(() => {
console.log("Done");
});
});
});
});import { readFile, writeFile } from "fs/promises";
async function main() {
try {
const getal1 = await readFile("getal1.txt", "utf-8");
const getal2 = await readFile("getal2.txt", "utf-8");
const result = await multiply(parseInt(getal1), parseInt(getal2));
await writeFile("resultaat.txt", result.toString(), "utf-8");
console.log("Done");
} catch (error) {
console.log(error);
}
}function log(message: string): void {
console.log(message);
}function log(message: string) {
console.log(message);
}function log(message) { // Error: Parameter 'message' implicitly has an 'any' type.
console.log(message);
}function multiply(a: number, b: number): number {
return a * b;
}
console.log(multiply(5)); // Error: Expected 2 arguments, but got 1.function multiply(a: number, b?: number): number {
return a * b; // Error: Object is possibly 'undefined'.
}function multiply(a: number, b?: number): number {
if (b === undefined) {
return a;
}
return a * b;
}function multiply(a: number, b: number = 1): number {
return a * b;
}
console.log(multiply(5)); // 5function sum(...numbers: number[]): number {
let total = 0;
for (let number of numbers) {
total += number;
}
return total;
}
console.log(sum(1,2,3,4,5)); // 15
console.log(sum(1,2,3)); // 6function add(a: number, b: number): number {
return a + b;
}let add = (a: number, b: number): number => {
return a + b;
}
console.log(add(1,2)); // 3let multiply = (a: number, b: number = 1): number => {
return a * b;
}let numbers = [1,2,3,4,5];
numbers.forEach((element) => {
console.log(element);
});function forEach(array: number[], callback: any) {
for (let element of array) {
callback(element);
}
}let numbers : number[] = [1,2,3,4,5];
forEach(numbers, (element) => {
console.log(element);
});interface Callback {
(element: number): void;
}function forEach(array: number[], callback: Callback) {
for (let element of array) {
callback(element);
}
}let numbers : string[] = ["een", "twee","drie];
forEach(numbers, (element) => {
console.log(element);
}); // Error: Argument of type '(string: any) => void' is not assignable to parameter of type 'Callback'.interface MathFunction {
(a: number, b: number): number;
}
function calculate(a: number, b: number, callback: MathFunction): number {
return callback(a,b);
}let result = calculate(5, 10, (a, b) => {
return a + b;
});
console.log(result); // 15let result = calculate(5, 10, (a, b) => {
return a * b;
});
console.log(result); // 50let hello = () => { console.log("hello"); };let hello = () => console.log("hello");interface MathFunction {
(a:number, b:number):number
};
let add1: MathFunction = (a,b) => { return a + b };
let add2: MathFunction = (a,b) => a + b ;interface Calculation {
(a:number):number
};
let double1: Calculation = (a) => { return 2*a };
let double2: Calculation = (a) => 2*a;
let double3: Calculation = a => 2*a;let numbers = [1,2,3,4,5];
numbers.forEach(element => console.log(element));
forEeach(numbers, element => console.log(element));let numbers : number[] = [1,2,3,4,5];
let doubled : number[] = numbers.map(element => element * 2);
console.log(doubled); // [2,4,6,8,10]let doubled : number[] = numbers.map((element: number) => element * 2);let numbers : number[] = [1,2,3,4,5];
let even : number[] = numbers.filter(element => element % 2 === 0);
console.log(even); // [2,4]let even : number[] = numbers.filter((element: number) => element % 2 === 0);let numbers : number[] = [1,2,3,4,5];
let sum : number = numbers.reduce((accumulator, element) => accumulator + element);
console.log(sum); // 15let sum : number = numbers.reduce((accumulator: number, element: number) => accumulator + element);let numbers : number[] = [1,2,3,4,5];
console.log(numbers.reduce((prev: number[], current: number) => [current, ...prev], []));let numbers : number[] = [1,2,3,4,5];
let firstEven : number | undefined = numbers.find(element => element % 2 === 0);
console.log(firstEven); // 2let names : string[] = ["Andie", "Bert", "Cedric"];
let firstD : string | undefined = names.find(name => name.startsWith("D"));
console.log(firstD); // undefinednpm inittsc --initnpm install --save-dev @types/nodeconsole.log('Hello, world!');ts-node hello.tsnpx create-clean-node[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
{
"userId": 1,
"id": 2,
"title": "qui est esse",
"body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
},
...
{
"userId": 10,
"id": 100,
"title": "at nam consequatur ea labore ea harum",
"body": "cupiditate quo est a modi nesciunt soluta\nipsa voluptas error itaque dicta in\nautem qui minus magnam et distinctio eum\naccusamus ratione error aut"
}
]interface Post {
userId: number;
id: number;
title: string;
body: string;
}fetch('https://jsonplaceholder.typicode.com/posts')
.then((response) => response.json())
.then((response: Post[]) => {
console.log(response[0].title);
}).catch((error) => {
console.log(error);
});(async function () {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/posts');
const posts : Post[] = await response.json();
console.log(posts[0].title);
} catch (error: any) {
console.log(error);
}
})();fetch('https://jsonplaceholder.typicode.com/posts/123')
.then(r => {
if (!r.ok) throw new Error(r.status)
return r.json()
})
.then(r => console.log(r))
.catch(e => console.log(e));(async function () {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/posts/123');
if (!response.ok) throw new Error(response.status);
const posts : Post[] = await response.json();
console.log(posts[0].title);
} catch (error: any) {
console.log(error);
}
})();(async function () {
try {
const response = await fetch('https://jsonplaceholder.typicode.com/posts/123');
if (response.status === 404) throw new Error('Not found');
if (response.status === 500) throw new Error('Internal server error');
const posts : Post[] = await response.json();
console.log(posts[0].title);
} catch (error: any) {
console.log(error);
}
})();const promise = new Promise<number>((resolve, reject) => {
setTimeout(() => {
resolve(2*2);
}, 1000);
});promise.then((result : number) => {
console.log(result);
});function multiply(number1: number, number2: number): Promise<number> {
return new Promise<number>((resolve, reject) => {
setTimeout(() => {
resolve(number1 * number2);
}, 1000);
});
};const result = multiply(2, 2);
console.log(result); Promise { <pending> }const result = multiply(2, 2);
result.then((result) => {
console.log(result);
});multiply(2, 2).then((result) => {
console.log(result);
});function multiply(number1: number, number2: number): Promise<number> {
return new Promise<number>((resolve, reject) => {
setTimeout(() => {
if (number1 * number2 > 10) {
reject(new Error("Result is greater than 10"));
} else {
resolve(number1 * number2);
}
}, 1000);
});
};multiply(4,10)
.then((result) => console.log(result))
.catch((error) => console.log(error.message))Promise.all([multiply(2, 2), multiply(3, 3), multiply(4, 4)])
.then((results: number[]) => console.log(results))
.catch((error) => console.log(error.message));[4, 9, 16]import { readFile } from "fs/promises";
readFile("test.txt", "utf-8")
.then((result: string) => console.log(result))
.catch((error) => console.log(error.message));import { lookup } from 'dns/promises';
lookup('ap.be')
.then((result) => console.log(result))
.catch((error) => console.error(error));function divide(a: number, b: number): number {
if (b == 0) {
throw new Error("Division by zero is not allowed");
}
return a / b;
}
console.log(divide(5, 0)); // Error: Division by zero is not allowedtry {
console.log(divide(5, 0));
} catch (error) {
console.log("Je kan niet delen door 0");
}import * as readline from 'readline-sync';
function divide(a: number, b: number): number {
if (b == 0) {
throw new Error("Division by zero is not allowed");
}
return a / b;
}
let result : number | undefined = undefined;
while (result == undefined) {
let a = readline.questionInt("Geef een getal: ");
let b = readline.questionInt("Geef een getal: ");
try {
result = divide(a, b);
} catch (error) {
console.log("Je kan niet delen door 0");
}
}
console.log("Het resultaat is " + result);try {
console.log(divide(5, 0));
} catch (error) {
console.log("Je kan niet delen door 0");
} finally {
console.log("Dit print altijd");
}Je kan niet delen door 0
Dit print altijdtry {
console.log(divide(5, 0));
} catch (error : any) {
console.log(error.message);
}try {
console.log(divide(5, 0));
} catch (error : unknown) {
if (error instanceof Error) {
console.log(error.message);
}
}Division by zero is not allowedfunction divide(a: number, b: number): number {
if (b == 0) {
throw "Division by zero is not allowed";
}
return a / b;
}interface User {
id: number;
email: string;
first_name: string;
last_name: string;
avatar: string;
}
interface RootObject {
page: number;
per_page: number;
total: number;
total_pages: number;
data: User[];
}async function main() {
try {
const response = await fetch('https://reqres.in/api/users');
if (!response.ok) throw new Error(response.statusText);
const users : RootObject = await response.json();
for (const user of users.data) {
console.log(user.first_name);
}
} catch (error: any) {
console.log(error);
}
};
main();async function main() {
try {
let page : number = 1;
let total_pages : number = 1;
while (page <= total_pages) {
const response = await fetch("https://reqres.in/api/users?page=" + page);
if (!response.ok) throw new Error(response.statusText);
const root : RootObject = await response.json();
total_pages = root.total_pages;
console.log("Page " + page);
for (const user of root.data) {
console.log(user.first_name);
}
page++;
}
} catch (error: any) {
console.log(error);
}
};
main();



function areaCircle(r: number): number {
return Math.PI * r * r;
}
function areaSquare(s: number): number {
return s * s;
}
function areaRectangle(l: number, w: number): number {
return l * w;
}export function areaCircle(r: number): number {
return Math.PI * r * r;
}
export function areaSquare(s: number): number {
return s * s;
}
export function areaRectangle(l: number, w: number): number {
return l * w;
}import { areaCircle, areaSquare, areaRectangle } from './area';import { areaCircle, areaSquare, areaRectangle } from './functions/area';console.log(areaCircle(2));
console.log(areaSquare(2));export default function(r: number): number {
return Math.PI * r * r;
}import areaCircle from './area';import area from './area';export interface Person {
name: string;
age: number;
}import { Person } from './types';import type { Person } from './types';# Install als Dependency
# Packages die essentieel zijn voor de uitvoering van je applicatie in productie
npm install readline-sync
# Install als DevDependency
# Packages die je nodig hebt voor de ontwikkeling van je project
npm install @types/readline-sync --save-dev{
"name": "project-name",
"version": "1.0.0",
"description": "Project description",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "Andie Similon",
"license": "ISC",
"dependencies": {
"readline-sync": "^1.4.10"
},
"devDependencies": {
"@types/readline-sync": "^1.4.8"
}
}npm installnpm uninstall <package-name>import readline from 'readline-sync';const name = readline.question('Wat is je naam? ');npm install chalk@4import chalk from 'chalk';
const name = 'Jelle';
console.log(chalk.red(name));npm install --save-dev @types/readline-syncnpm install --save-dev @types/node
npm install --save-dev @types/readline-sync
npm install --save-dev @types/express
npm install --save-dev @types/ejs
...declare module 'rainbow-colors-array';npm install lodashnpm install --save-dev @types/lodashvar _ = require('lodash');import _ from 'lodash';const array = [1, 2, 3];
console.log(_.reverse(array));console.log(_.round(4.006, 2));https://www.google.be/search?q=ap&client=safarilet people = ["Sven","Andie","George","Geoff"];
app.get("/person",(req,res)=>{
res.type("text/html")
// TypeScript kan niet garanderen dat deze parameter een geldige waarde heeft gekregen
// de if staat ons toe binnen dat block te veronderstellen dat string het type is
if (typeof req.query.index === "string") {
let index = parseInt(req.query.index);
res.send(people[index]);
}
else {
res.send("Ongeldige parameterwaarde.");
}
});<form action="/" method="get">
<label for="search">Search for a name:</label>
<input type="text" id="search" name="q" value="<%= q %>">
<button type="submit">Search</button>
</form>
<% for (let person of persons) { %>
<p><%= person.name %> (<%= person.age %>)</p>
<% } %> interface Person {
name: string;
age: number;
}
const persons: Person[] = [
{ name: "Sven", age: 25 },
{ name: "Andie", age: 24 },
{ name: "George", age: 30 },
{ name: "Zeoff", age: 28 },
...
]
app.get("/", (req, res) => {
let q : string = typeof req.query.q === "string" ? req.query.q : "";
let filteredPersons: Person[] = persons.filter((person) => {
return person.name.toLowerCase().startsWith(q.toLowerCase());
});
res.render("index", {
persons: filteredPersons,
q: q
});
});const sortField = typeof req.query.sortField === "string" ? req.query.sortField : "name";
const sortDirection = typeof req.query.sortDirection === "string" ? req.query.sortDirection : "asc";let sortedPersons = [...persons].sort((a, b) => {
if (sortField === "name") {
return sortDirection === "asc" ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name);
} else if (sortField === "age") {
return sortDirection === "asc" ? a.age - b.age : b.age - a.age;
} else {
return 0;
}
});res.render("index", {
persons: sortedPersons
});<form action="/" method="get">
<select name="sortField">
<option value="name">Name</option>
<option value="age">Age</option>
</select>
<select name="sortDirection">
<option value="asc">Ascending</option>
<option value="desc">Descending</option>
</select>
<button type="submit">Sort</button>
</form>
<% for (let person of persons) { %>
<p><%= person.name %> (<%= person.age %>)</p>
<% } %><form action="/" method="get">
<select name="sortField">
<option value="name" <%= sortField === "name" ? "selected" : "" %>>Name</option>
<option value="age" <%= sortField === "age" ? "selected" : "" %>>Age</option>
</select>
<select name="sortDirection">
<option value="asc" <%= sortDirection === "asc" ? "selected" : "" %>>Ascending</option>
<option value="desc" <%= sortDirection === "desc" ? "selected" : "" %>>Descending</option>
</select>
<button type="submit">Sort</button>
</form>res.render("index", {
persons: sortedPersons,
sortField: sortField,
sortDirection: sortDirection
});const sortFields = [
{ value: "name", text: "Name", selected: sortField === "name" ? "selected" : "" },
{ value: "age", text: "Age", selected: sortField === "age" ? "selected" : ""}
];
const sortDirections = [
{ value: "asc", text: "Asc", selected: sortDirection === "asc" ? "selected" : ""},
{ value: "desc", text: "Desc", selected: sortDirection === "desc" ? "selected" : ""}
];res.render("index", {
persons: sortedPersons,
sortFields: sortFields,
sortDirections: sortDirections
});<form action="/" method="get">
<select name="sortField">
<% for (let field of sortFields) { %>
<option value="<%= field.value %>" <%= field.selected %>><%= field.text %></option>
<% } %>
</select>
<select name="sortDirection">
<% for (let direction of sortDirections) { %>
<option value="<%= direction.value %>" <%= direction.selected %>><%= direction.text %></option>
<% } %>
</select>
<button type="submit">Sort</button>
</form>
<% for (let person of persons) { %>
<p><%= person.name %> (<%= person.age %>)</p>
<% } %>let people = ["Sven","Andie","George","Geoff"];
app.get("/person/:index",(req,res)=>{
let index = parseInt(req.params.index);
res.type("text/html")
res.send(people[index]);
})let people = ["Sven","Andie","George","Geoff"];
app.get("/person/:index/replace/:newname",(req,res)=>{
let index = parseInt(req.params.index);
let oldName = people[index];
people[index] = req.params.newname;
res.type("text/html")
res.send(`Old name was ${oldName}, new name is ${people[index]}`);
})npm install expressnpm install --save-dev @types/expressimport express from "express";
const app = express();
app.set("port", 3000);
app.get("/", (req, res) => {
res.type("text/html");
res.send("Hello <strong>World</strong>");
});
app.listen(app.get("port"), () =>
console.log("[server] http://localhost:" + app.get("port"))
);import express from "express";
const app = express();app.set("port", 3000);app.listen(app.get("port"),
()=>console.log( "[server] http://localhost:" + app.get("port")));app.get("/",(req,res)=>{
res.type("text/html");
res.send("Hello <strong>World</strong>")
})res.type("text/html");res.send("Hello <strong>World</strong>")app.get("/",(req,res)=>{
res.type("text/html");
res.send("Yet another hello world app...")
});
app.get("/helloworld",(req,res)=>{
res.type("text/html");
res.send("Hello World")
});
app.get("/goodbye",(req,res)=>{
res.type("text/html");
res.send("Later <strong>World</strong>")
});app.use((req, res) => {
res.type("text/html");
res.status(404);
res.send("404 - Not Found");
}
);res.status(404);import express from "express";
const app = express();
interface Person {
name: string;
age: number;
}
const data : Person[] = [
{
name: "george",
age: 50
},
{
name: "jane",
age: 32
},
{
name: "john",
age: 42
},
];
app.get("/getData",(req,res)=>{
res.type("application/json");
res.json(data);
})
app.listen(app.get("port"), ()=>console.log( "[server] http://localhost:" + app.get("port")));res.type("application/json");res.json(data);app.get("/users",async (req,res) =>{
let response = await fetch("https://jsonplaceholder.typicode.com/users");
let data = await response.json();
res.type("application/json");
res.json(data);
});let data : Person[] = [];
app.get("/getData",(req,res)=>{
res.type("application/json");
res.json(data);
});
app.listen(app.get("port"), async ()=>{
let response = await fetch("https://jsonplaceholder.typicode.com/users");
data = await response.json();
console.log( "[server] http://localhost:" + app.get("port"));
});npm install multer
npm install --save-dev @types/multerimport multer from "multer";
const upload = multer({
dest: "public/uploads",
});<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="avatar" />
<input type="submit" value="Upload" />
</form>import express from "express";
import ejs from "ejs";
import multer from "multer";
import path from "path";
const app = express();
app.set("view engine", "ejs");
app.use(express.static(path.join(__dirname, "public")));
const upload = multer({
dest: "public/uploads",
});
app.get("/", (req, res) => {
res.render("index")
});
app.post("/upload", upload.single("avatar"), (req, res) => {
let file = req.file as Express.Multer.File;
if (file) {
res.type("text/html");
res.send(`<img src="uploads/${file.filename}"/>`);
} else {
res.send("No file uploaded");
}
});
app.listen(3000, () => {
console.log("Server started on port 3000");
});<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="photos" multiple />
<input type="submit" value="Upload" />
</form>app.post("/upload", upload.array("photos", 5), (req, res) => {
let files = req.files as Express.Multer.File[];
if (files) {
res.type("text/html");
res.send(files.map((file) => `<img src="${file.filename}"/>`).join("<br/>"));
} else {
res.send("No files uploaded");
}
});<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="avatar" />
<input type="file" name="gallery" multiple />
<input type="submit" value="Upload" />
</form>interface FilesDictionary {
[fieldname: string]: Express.Multer.File[];
}
app.post(
"/upload",
upload.fields([
{ name: "avatar", maxCount: 1 },
{ name: "gallery", maxCount: 8 },
]),
(req, res) => {
let files = req.files as FilesDictionary
let avatar = files["avatar"][0];
res.type("text/html");
res.send(`<h1>Avatar</h1>
<img src="/${avatar.filename}"><br/>
<h1>Photos</h1>
${files["gallery"].map((file) => `<img src="/${file.filename}">`).join("")}}`);
}
);app.use(express.static("public"));|- public
|- css
|- reset.css
|- some-style.css
|- other-style.css
|- style.css
|- js
|- some-script.js
|- other-script.js
|- script.js
|- assets
|- images
|- image-01.jpg
|- image-02.jpg
|- image-03.jpg
|- image-04.jpg
|- fonts
|- cool-font.woff
|- other-font.woff
|- icons
|- logo.png
|- logo_small.png
|- favicon.icoform<form action="/register" method="post">
<div>
<label for="fname">First name?</label>
<input name="fname" id="fname" placeholder="George" type="text">
</div>
<div>
<label for="lname">Last Name?</label>
<input name="lname" id="lname" placeholder="Smith" type="text">
</div>
<div>
<label for="email">Email?</label>
<input name="email" id="email" type="email">
</div>
<div>
<label for="lname">Password</label>
<input name="password" id="password" type="password">
</div>
<div>
<button type="submit">Register</button>
</div>
</form>app.get("/register", (req, res) => {
res.render("register");
});app.post("/register", (req, res) => {
// code hier
});app.use(express.json({ limit: "1mb" }));
app.use(express.urlencoded({ extended:true}))app.post("/register", (req, res) => {
let fname: string = req.body.fname;
let lname: string = req.body.lname;
let email: string = req.body.email;
let password: string = req.body.password;
...
});app.post("/register", (req, res) => {
let fname: string = req.body.fname;
let lname: string = req.body.lname;
let email: string = req.body.email;
let password: string = req.body.password;
if (fname === "" || lname === "" || email === "" || password === "") {
res.render("register", { error: "All fields are required" });
} else if (!email.includes("@")) {
res.render("register", { error: "Invalid email" });
} else {
// code om de data te verwerken
}
});<% if (error) { %>
<p><%= error %></p>
<% } %>app.get("/register", (req, res) => {
res.render("register", { error: "" });
});app.post("/register", (req, res) => {
let fname: string = req.body.fname;
let lname: string = req.body.lname;
let email: string = req.body.email;
let password: string = req.body.password;
if (fname === "" || lname === "" || email === "" || password === "") {
res.render("register", { error: "All fields are required" });
} else if (!email.includes("@")) {
res.render("register", { error: "Invalid email" });
} else {
console.log("Data is valid, saving user");
res.redirect("/success");
}
});<form action="/submit_form" method="post">
<!-- Text Input -->
<label for="name">Name:</label><br>
<input type="text" id="name" name="name"><br>
<!-- Email Input -->
<label for="email">Email:</label><br>
<input type="email" id="email" name="email"><br>
<!-- Password Input -->
<label for="password">Password:</label><br>
<input type="password" id="password" name="password"><br>
<!-- Number Input -->
<label for="age">Age:</label><br>
<input type="number" id="age" name="age" min="0"><br>
<!-- Date Input -->
<label for="dob">Date of Birth:</label><br>
<input type="date" id="dob" name="dob"><br>
<!-- Radio Buttons -->
<p>Gender:</p>
<input type="radio" id="male" name="gender" value="male">
<label for="male">Male</label><br>
<input type="radio" id="female" name="gender" value="female">
<label for="female">Female</label><br>
<input type="radio" id="other" name="other" value="other">
<label for="other">Other</label><br>
<!-- Checkbox -->
<p>Terms and conditions:</p>
<input type="checkbox" id="terms" name="terms" value="agree">
<label for="terms"> Accept terms and conditions</label><br>
<!-- Dropdown List -->
<label for="country">Country:</label><br>
<select id="country" name="country">
<option value="usa">United States</option>
<option value="canada">Canada</option>
<option value="uk">United Kingdom</option>
</select><br>
<!-- Dropdown Mutliple -->
<label for="languages">Languages</label><br>
<select id="languages" name="languages" multiple>
<option value="english">English</option>
<option value="spanish">Spanish</option>
<option value="french">French</option>
<option value="german">German</option>
</select><br>
<!-- Textarea -->
<label for="bio">Bio:</label><br>
<textarea id="bio" name="bio" rows="4" cols="50"></textarea><br>
<!-- Hidden Input -->
<input type="hidden" id="hiddenElement" name="hiddenElement" value="hiddenValue">
<!-- Color Input -->
<label for="color">Favorite Color:</label><br>
<input type="color" id="color" name="color"><br>
<!-- Range Input -->
<label for="range">Range:</label><br>
<input type="range" id="range" name="range" min="0" max="100"><br>
<!-- Year Input -->
<label for="year">Year:</label><br>
<input type="number" id="year" name="year" min="1900" max="2099" step="1" value="2021"><br>
<!-- Week Input -->
<label for="week">Week:</label><br>
<input type="week" id="week" name="week"><br>
<button type="submit">Submit</button>
</form>app.post("/submit_form", (req, res) => {
let name : string = req.body.name;
let terms : boolean = req.body.terms === "agree";
let email : string = req.body.email;
let password : string = req.body.password;
let age : number = parseInt(req.body.age);
let dob : Date = new Date(req.body.dob);
let gender : Gender = req.body;
let country : Country = req.body.country;
let languages: Language[] = req.body.languages;
let bio: string = req.body.bio;
let hiddenElement: string = req.body.hiddenElement;
let color: string = req.body.color;
let range: number = parseInt(req.body.range);
let year: number = parseInt(req.body.year);
let week: string = req.body.week;
res.send(req.body);
});
// token is een eerder aangemaakt JWT token
// "jwt" is hier een identifier voor je cookie
// de exacte betekenis van de waarden vind je op https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
res.cookie("jwt", token, { httpOnly: true, sameSite: "lax", secure: true });Geef je gewicht in (in kg): 80
Geef je lengte in (in m): 1.80
Je BMI is 24.69import * as jwt from 'jsonwebtoken';const token = jwt.sign(user, process.env.JWT_SECRET!, { expiresIn: "7d" });
res.cookie("jwt", token, { httpOnly: true, sameSite: "lax", secure: true });JWT_SECRET=75b1c9c99a5167b61951d3bdfb56880e156d55d3795da78235b74ea495d0a6efccac596e182dfc9a8e116b54d663d122aaded48631be87aebbb2aa9dc5e09805009f2e2e9459f1ff7d8331e1a6746dd2d19437c98000194037309b8fe53591cd930c1d14e2a97b27e3444359c3a99b1da8e53842317514e628f93863419b9022import { NextFunction, Request, Response } from "express";
import * as jwt from "jsonwebtoken";
export function secureMiddleware(req: Request, res: Response, next: NextFunction) {
const token: string | undefined = req.cookies?.jwt;
if (!token) {
console.log("No token found, redirecting to login");
return res.redirect("/login"); // or return a 401 Unauthorized response
}
jwt.verify(token, process.env.JWT_SECRET!, (err, user) => {
if (err) {
res.redirect("/login");
} else {
console.log(user);
res.locals.user = user;
next();
}
});
};app.use(cookieParser());router.post("/logout", secureMiddleware, async (req, res) => {
res.clearCookie("jwt");
res.redirect("/login");
});"scripts": {
"start": "nodemon index.ts"
}npm startnpm install -g nodemonnodemon index.tsnpx nodemon index.tsimport * as jwt from 'jsonwebtoken';
// Dit is de informatie die we willen opslaan in de JWT
const payload = {
userId: 123,
username: 'johndoe',
};
// Dit is het geheim dat we gebruiken om de JWT te ondertekenen en te beveiligen
const secret = 'my_secret_key';
// We gebruiken de jwt.sign functie om de JWT te genereren
const token = jwt.sign(payload, secret);
// Nu kunnen we de JWT gebruiken om de opgeslagen informatie te versturen of op te halen
console.log(token);import * as jwt from 'jsonwebtoken';
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';
const secret = 'my_secret_key';
try {
let decoded = jwt.verify(token, secret);
console.log(decoded);
} catch (error) {
console.error(error);
}What's your name? Andie
Hello, Andie!Geef het aantal personen in: 2
Geef de naam van persoon 1 in: Jan
Geef het gewicht van Jan in (in kg): 80
Geef de lengte van Jan in (in m): 1.80
Jan heeft een BMI van 24.69
Geef de naam van persoon 2 in: Piet
Geef het gewicht van Piet in (in kg): 90
Geef de lengte van Piet in (in m): 1.75
Piet heeft een BMI van 29.391. [ ] Task 1
2. [X] Task 2
3. [X] Task 3[1] Task 1
[2] Task 2
[3] Task 3
What did you do? [1, 2, 3]: 2
Geef het email adres in: andie.similon@ap.be
De naam is A. Similon
Wil je nog een email adres ingeven? (y/n) y
Geef het email adres in: sven.maes@ap.be
De naam is S. Maes
Wil je nog een email adres ingeven? (y/n) n
Nog een goede dag!let pokemon: string[] = [
"Bulbasaur",
"Ivysaur",
"Venusaur",
"Charmander",
"Charmeleon",
"Charizard",
"Squirtle",
"Wartortle",
"Blastoise",
"Caterpie",
"Metapod",
"Butterfree",
"Weedle",
"Kakuna",
"Beedrill",
"Pidgey",
"Pidgeotto",
"Pidgeot",
"Rattata",
"Raticate",
"Spearow",
];0. Bulbasaur
1. Ivysaur
2. Venusaur
3. Charmander
4. Charmeleon
...Welke pokemon wil je in je team? [0-20]: 4
Welke pokemon wil je in je team? [0-20]: 3
Welke pokemon wil je in je team? [0-20]: STOPWelke pokemon wil je in je team? [0-20]: 4
Welke pokemon wil je in je team? [0-20]: 3
Welke pokemon wil je in je team? [0-20]: 4
Deze pokemon zit al in je team
Welke pokemon wil je in je team? [0-20]: 2
Welke pokemon wil je in je team? [0-20]: STOPWelke pokemon wil je in je team? [0-20]: 21
Deze pokemon ken ik niet
Welke pokemon wil je in je team? [0-20]: 4Welke pokemon wil je in je team? [0-20]: 1
Welke pokemon wil je in je team? [0-20]: 2
Welke pokemon wil je in je team? [0-20]: 3
Welke pokemon wil je in je team? [0-20]: 4
Welke pokemon wil je in je team? [0-20]: 5
Welke pokemon wil je in je team? [0-20]: 6
Welke pokemon wil je in je team? [0-20]: STOP
Jouw team van pokemon is:
1. Ivysaur
2. Venusaur
3. Charmander
4. Charmeleon
5. Charizard
6. Squirtle
Geef de tekst in: Hello World
+-------------+
| Hello World |
+-------------+
Geef de tekst in: Hey broer
+-----------+
| Hey broer |
+-----------+
Geef de tekst in:
Tot ziens!
Enter a string: hello
uryyb
Movie from file:
The Matrix (1999)
Actors: Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss
Metascore: 73
Seen: NO
My favorite movie:
The Shawshank Redemption (1994)
Actors: Tim Robbins, Morgan Freeman, Bob Gunton
Metascore: 80
Seen: YES
My worst movie:
The Room (2003)
Actors: Tommy Wiseau, Juliette Danielle, Greg Sestero
Metascore: 9
Seen: YESRecept: Lasagne
Beschrijving: Lekkere lasagne
Personen: 4
Ingredienten:
- 1 pak lasagnevellen
- 500g gehakt
- 1 ui
- 1 teentje look
Totale kostprijs: 10 euro[1, 2, 3, 4, 5](4 + 5) * (6 - 3) / 2 = 13.5const printStuff = (amount: number, text: string):void => {
console.log(`Hello ${text}, you are number ${amount}`);
}
const twoDArray = (element1: string, element2: string): string[] => {
return [element1, element2];
}
const numberToString = (number: number): string => {
return `${number}`;
}interface Callback {
(n: number): void
}
const getRandom = (callback: Callback) => {
setTimeout(() => {
callback(Math.floor(Math.random() * 100))
},1000);
}
getRandom((n) => {
console.log(`The number was ${n}`);
});const numbers: number[] = [-4,-4,1,2,3,4,5];
console.log(filterPositive(numbers)); // 1,2,3,4,5const numbers: number[] = [-4,-4,1,2,3,4,5];
console.log(filterNegative(numbers)); // -4,-4const numbers: number[] = [-4,-4,1,2,3,4,5];
console.log(filterEven(numbers)); // -4,-4,2,4const numbers: number[] = [-4,-4,1,2,3,4,5];
const isPositive = (number: number) => number >= 0;
console.log(filter(numbers, isPositive)); // 1,2,3,4,5const slowSum = (a: number, b: number) => {
return new Promise<number>((resolve, reject) => {
setTimeout(() => {
resolve(a+b);
},1000)
});
}
const slowMult = (a: number, b: number) => {
return new Promise<number>((resolve, reject) => {
setTimeout(() => {
resolve(a*b);
},1500)
});
}You cannot divide by zero
1 + 5 = 6
(6 / 3) = 2
(1 + 5) * 2 = 12Mojito
Old Fashioned
Long Island Teainterface TestFunction {
(n: number): boolean
}console.log(atLeastTwo([2,3,4,6,8], isOdd));
console.log(atLeastTwo([2,3,4,5,6,8], isOdd));false
true[1] France
[2] Netherlands
[3] United Kingdom
[4] Belgium
[5] luxembourg
[6] Ireland
[7] Spain
[8] Portugal
[0] CANCEL
Which country would you like to list its Colleges with high school education degrees? [1...8 / 0]: 2
Colleges in Netherlands:
University of Sint Eustatius School of Medicine
International University School of Medicine (IUSOM)
St.James's School of Medicine, Bonaire
University of the Netherlands Antilles, Curacao
Dutch Delta University
De Haagse Hogeschool
Erasmus University Rotterdam
Rotterdam School of Management
European Open University
Fontys University of Applied Sciences
Foundation University
Hanze University Groningen
Hogeschool voor de Kunsten Utrecht (HKU)
Hotelschool The Hague
...Welke valuta wil je zien? (EUR, USD, GBP): USD
De huidige prijs van bitcoin is 51547.13 USDWelke valuta wil je zien? (EUR, USD, GBP): JPY
Deze valuta wordt niet ondersteundconst delay = (delay: number): Promise<void> => {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
}, delay);
});
}
(async() => {
await Promise.all([delay(1000), delay(10000), delay(15000)])
console.log("Done!");
})();