【问题标题】:Unable to establish cookie session无法建立 cookie 会话
【发布时间】:2020-01-09 22:16:52
【问题描述】:

我目前正在使用 javascript 做一个用户注册界面。但是我没有成功建立一个cookie会话。

在localhost网络上唱起来后,提示这个信息--> site can't be reach. localhost 拒绝连接。

我已经重新安装了 cookie-session 包,但仍然无法正常工作

有没有办法让它工作?

这是来自终端的错误消息: (节点:7978)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“id” 在 /Users/gabrielswee/Desktop/Desktop 文件夹/课程/Javascript/ecomm/index.js:58:29 (节点:7978) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:1) (节点:7978)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

这是我的语法

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");

【问题讨论】:

    标签: javascript node.js authentication cookie-session


    【解决方案1】:

    问题是在UsersRepositorycreate 函数中,您没有返回创建的用户,所以在这里:

     //NOTE: Create users in the user repository
        const user = await usersRepo.create({
            email,
            password
       });
    

    user 将始终为undefined,当您拨打下一行时

    req.session.userId = user.id;

    那个错误被抛出

    为了解决这个问题:

    async create(attrs) {
        attrs.id = this.randomId();
        const records = await this.getAll();
        records.push(attrs);
        await this.writeAll(records);
        return attrs; // <--- return the created user
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-13
      • 1970-01-01
      • 2015-12-11
      • 2014-10-27
      • 2017-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      相关资源
      最近更新 更多