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();
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(
cookieSession({
name: "session",
keys: ["lucky6226"]
})
);
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>
`);
});
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");
}
const user = await usersRepo.create({
email,
password
});
req.session.userId = user.id;
res.send("Account Created !!!");
});
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 {
fs.accessSync(this.filename);
} catch (err) {
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) {
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();
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`);
}
Object.assign(record, attrs);
await this.writeAll(records);
}
async getOneBy(filters) {
const records = await this.getAll();
for (let record of records) {
let found = true;
for (let key in filters) {
if (record[key] !== filters[key]) {
found = false;
}
}
if (found === true) {
return record;
}
}
}
module.exports = new UsersRepository("users.json")
What I have tried:
I tried retyping and reinstalling the node packages but it did not work