Cover photo

ثبت نام و ورود کاربران با node.js به صورت عامه پسند

به نام او

مواد و وسایل لازم :

یک عدد ادیتور

مجهز بودن سیستم به node.js و mongodb

تو این پروژه من با استفاده از express این سیستم رو مینویسم:

خب اول از همه فایل papackage.json رو ایجاد میکنیم.

npm init -y

و اکسپرس رو نصب می‌کنیم:

npm i -S express

بعد از اون فایل index.js رو در مسیر پروژه مون میسازیم.

// index.js

const express = require("express");
const app = express();

app.use(express.json());

const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Running on port ${port} ...`));

پوشه های models و routes رو در پروژمون ایجاد می‌کنیم.

در داخل پوشه models ما، مدل هایی که قراره در دیتابیس ما ذخیره بشن قرار می‌گیره.

پس بهتره اول از همه mongoose رو نصب کنیم و با تغییرات ریزی توی index.js به دیتابیس خودمون وصل بشیم.

پس برای نصب :

npm i -S mongoose

و کد های زیر رو به فایل index.js اضافه می‌کنیم.

const mongoose = require("mongoose");

mongoose.set("useFindAndModify", false);
mongoose.set("useCreateIndex", true);

mongoose
 .connect("mongodb://localhost:27017/project", {
    useNewUrlParser: true,
    authSource: "admin"
 })
 .then(() => console.log("Connected to Mongo DB ..."))
 .catch(() => console.error("Could not connect to Mongo DB ..."));

در توضیح کد های بالا باید بهتون بگم با متد connect و دادن آدرس لوکال هاست یا اونجایی که دیتابیسمون مستقره بهش متصل میشیم.

اگه دیتابیس شما روی سرور قرار داره میتونید از فرمت زیر با توجه به مشخصاتتون در قسمت آدرس استفاده کنید .

mongodb://<USERNAME>:<PASSWORD>@<HOST>:<PORT>/<NAME>

حالا برای اینکه مطمئن بشیم که روی لوکال هاست، تونستیم به دیتابیسمون کانکت بشیم، در وهله اول تو ترمینالمون دستورعه

رو اجرا میکنیم و پس از اون میایم در مسیر پروژه خودمون و دستور node index.js رو اجرا میکنیم. اگر عبارت Connected to Mongo DB ... رو دیدید میتونید یه جشن کوچولو برا خودتون بگیرید :)

خب حالا بریم سراغ ساخت مدل خودمون، وارد پوشه models میشیم و فایل user.js رو میسازیم.

// user,js
const mongoose = require("mongoose");

const userSchema = new mongoose.Schema({
  username: {
    type: String,
    required: true,
    minlength: 5,
    maxlength: 255,
    unique: true
 },
  email: {
    type: String,
    required: true,
    minlength: 5,
    maxlength: 255,
    unique: true
 },
  password: {
    type: String,
    required: true,
    minlength: 8,
    maxlength: 1024
 }
});

const User = mongoose.model("User", userSchema);

exports.userSchema = userSchema;
exports.User = User;

خب با متد new mongoose.Schema میتونیم اون مواردی که قراره user ما داشته باشه رو مشخص کنیم برای مثال ما تو این پروژه برای user ، یوزرنیم ، ایمیل و پسورد رو قرار دادیم.

حالا نوبت این میرسه که ما User رو بسازیم که برای اینکار کافیه mongoose.mode رو استفاده کنیم و userSchema بهش پاس بدیم.

و در آخر User رو export میکنیم که بتونیم تو جاهای مختلفی از پروژمون ازش استفاده کنیم.

تو این پروژه من قصد دارم از یک پکیج به اسم joi استفاده کنم برای اعتبار سنجی مدلی که ساختم

برای نصب این پکیج از دستور زیر استفاده میکنیم

 npm i -S @hapi/joi

خب حالا برای اینکه الگو یا userSchema ایی رو که نوشتیم بتونیم با joi، اعتبار سنجی کنیم یک متد validateUser داخل user.js مینویسیم. و اونم export میکنیم.

const Joi = require('@hapi/joi');

function validateUser(user) {
 const schema =   Joi.object().keys({
    username: Joi.string().min(5).max(255)required(),
    email: Joi.string().min(5).max(255).required().email(),
    password:  Joi.string().min(8).required()
 }) ;
 return Joi.validate(user, schema);
};

exports.validate = validateUser;

حالا اگه خواستید تو پسوردتون یسری شاخ بازیا? در بیارید مثل اینکه یک حرف بزرگ داشته باشه و یک حرف کوچیک و یک کاراکتر و ... میتونید از یک پکیج دگ به اسم joi-password-complexity استفاده کنید.

حالا میریم داخل پوشه routes، که مسیرهایی که نیاز رو آدرس دهی کنیم. فایل users.js رو برای ثبت نام کردن کاربر ایجاد می‌کنیم.

const { User, validate } = require("../models/user");
const express = require("express");
const router = express.Router();

router.post("/", async (req, res) => {
  //we will copelete this section
});

module.exports = router;

حالا وارد index.js میشیم و این route که نوشتیم رو به اکسپرسمون اضافه میکنیم.

const users = require("./routes/users");

app.use("/api/users", users);

حالا دوباره به متد postایی که تو users.js نوشتیم برمیگردیم تا کاملش کنیم .

برای بررسی اینکه اطلاعاتی که از سمت کاربر برای ما اومده درست اینکارو میکنیم، اگر خطایی وجود داشت، خطا رو به کاربر منتقل میکنیم.

const { error } = validate(req.body);
 if (error) return res.status(400).send(error.details[0].message);

برای اینکه کاربر تکراری نتونه دوباره ثبت نام کنه، با کد های زیر بررسی میکنیم که آیا یوزرنیم و ایمیلی قبلا با اطلاعاتی که الان وارد شده موجود هست یا نه و اگه موجود بود خطا برمیگردونیم .

let user =
    (await User.findOne({ username: req.body.username })) ||
    (await User.findOne({ email: req.body.email }));
 if (user) return res.status(400).send("User already registered.");

اگه اطلاعاتی که کاربر فرستاده بود از این دو مرحله جون سالم به در بردن حالا میتونیم اونارو تو دیتابیسمون ذخیره سازی کنیم. قبل از اینکه این کار رو بکنیم به متد pick_ از پکیج loadash جلب میکنم . کار این متد اینکه (طبق داکیومنت):

_.pick(object, [paths])

Creates an object composed of the picked object properties.

خب برای نصب :

npm i -S loadash

و برای استفاده از دستور :

const _ = require("lodash");

حالا برگردیم سر جایی ک بودیم و ذخیره کاربر

user = new User(
 _.pick(req.body, [
 "username",
 "email",
 "password",
    ])
  );
 await user.save();
 res.send(_.pick(user, ["_id", "firstname", "username"]));

خب کاربرمون به صحت و سلامت توی دیتابیسمون ذخیره شد? و این یعنی تمام شدن بخش ریجستر .

بخش ورود هم تقریبا شبیه بخش ثبت نامه با یکسری تفاوت جزیی که اونو تو نوشته‌ی بعدیم مینوسم، به همراه یسری کارای خفن تر مثل اعتبار سنجی کاربر با sms و یا ایمیل ?