Click here to Skip to main content
14,427,367 members
Rate this:
Please Sign up or sign in to vote.
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")


What I have tried:

I tried retyping and reinstalling the node packages but it did not work
Posted
Updated 9-Jan-20 3:49am
v2
Comments
Kornfeld Eliyahu Peter 9-Jan-20 9:55am
   
You should debug your code...
Based on the information 'user' (here: req.session.userId = user.id;) is undefined...
It may has something to do with you work with async/await...

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)




CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100