I am currently doing a user sign up interface using javascript. However I am unsuccessful to establish a cookie session.
After singing up in the localhost network, it prompt this message --> site cant be reach. localhost refuse to connect.
I have re-intsalled the cookie-session package but it is still not working
Is there anyway to make it work?
here is the error message from terminal:
(node:7978) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'id' of undefined
at /Users/gabrielswee/Desktop/Desktop Folders/Courses/Javascript/ecomm/index.js:58:29
(node:7978) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag --unhandled-rejections=strict
(see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:7978) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Here is my syntax
index.js
const express = require("express");
const bodyParser = require("body-parser");
const cookieSession = require("cookie-session");
const usersRepo = require("./repository/users");
const app = express();
//NOTE: Middleware: To automatically body parse the data
app.use(bodyParser.urlencoded({
extended: true
}));
//NOTE: Middleware: Cookie Session
app.use(
cookieSession({
name: "session",
keys: ["lucky6226"]
})
);
//NOTE: User Sign Up
app.get("/", (req, res) => {
res.send(`
<div>
Your id is:${req.session.userId}
<form method ="POST">
<input name ="email" placeholder="email" />
<input name ="password" placeholder="password" />
<input name ="passwordConfirmation" placeholder="password confirmation" />
<button>Sign Up</button>
</form>
</div>
`);
});
//NOTE: Validating User Email and Password
app.post("/", async (req, res) => {
const {
email,
password,
passwordConfirmation
} = req.body;
const existingUser = await usersRepo.getOneBy({
email
});
if (existingUser) {
return res.send("Email in use");
}
if (password !== passwordConfirmation) {
return res.send("Password must match");
}
//NOTE: Create users in the user repository
const user = await usersRepo.create({
email,
password
});
//NOTE: Store ID in the cookie. Use 3rd party package for Cookies --> npm install cookie-session
req.session.userId = user.id; //Add by cookie session
res.send("Account Created !!!");
});
//NOTE: HTTP Request
app.listen(3000, () => {
console.log("Connection established successfully");
});
user.js
const fs = require("fs");
const crypto = require("crypto");
class UsersRepository {
constructor(filename) {
if (!filename) {
throw new Error("Creating a repository requires a filename");
}
this.filename = filename;
try {
//NOTE: Check to see if the file exist
fs.accessSync(this.filename);
} catch (err) {
//NOTE: if file do not exists, create the file
fs.writeFileSync(this.filename, "[]");
}
}
async getAll() {
return JSON.parse(
await fs.promises.readFile(this.filename, {
encoding: "utf8"
})
);
}
async create(attrs) {
attrs.id = this.randomId();
const records = await this.getAll();
records.push(attrs);
await this.writeAll(records);
}
async writeAll(records) {
// NOTE: Write the updated 'records' array back to this.filename
await fs.promises.writeFile(
this.filename,
JSON.stringify(records, null, 2)
);
}
randomId() {
return crypto.randomBytes(4).toString("hex");
}
async getOne(id) {
const records = await this.getAll();
return records.find(record => record.id === id);
}
async delete(id) {
const records = await this.getAll();
//NOTE: Return true if ID is not the same
const filteredRecords = records.filter(record => record.id !== id);
await this.writeAll(filteredRecords);
}
async update(id, attrs) {
const records = await this.getAll();
const record = records.find(record => record.id === id);
if (!record) {
throw new Error(`Record with id ${id} is not found`);
}
//NOTE: Assign attrs {password} (attributes) into the record {email}
Object.assign(record, attrs);
//NOTE: Outcome --> record === {email: 'test@test.com', password: 'mypassword'}
await this.writeAll(records);
}
async getOneBy(filters) {
const records = await this.getAll();
//NOTE: outer for of loop --> looping through an array
for (let record of records) {
let found = true;
//NOTE: inner for in loop --> search an object
for (let key in filters) {
if (record[key] !== filters[key]) {
found = false;
}
}
if (found === true) {
return record;
}
}
}
//NOTE: File export
module.exports = new UsersRepository("users.json");