روزبه فرتاج
8 ماه پیش توسط روزبه فرتاج مطرح شد
0 پاسخ

ارور در ارسال پست


evry node app
│
├── پوشه config
│   ├── فایل default.json
│   ├── فایل development.json
│   └── فایل development.json
│
├── پوشه src
│   ├── پوشه models
│   │   └──  فایل user.js
│   └── پوشه routs
│        ├── پوشه auth
│        │   ├── فایل controller.js
│        │   ├── فایل index.js
│        │   └──  فایل validator.js
│        ├── فایل controller.js
│        └──  فایل index.js
│
├── فایل index.js
├── فایل package-lock.json
└── فایل package.json

دوستان در بالا پوشه بندی پروژه من را داری می بینی. و حالا موارد درون هر فایل را می گذارم.

فایل index.js:
const express = require('express');

const app = express();
app.use(express.json());

const mongoose = require('mongoose');
const config = require('config');
const router = require('./src/routs');

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static('public'));

mongoose
  .connect(config.get('db.address'))
  .then(() => console.log('connected to mongodb'))
  .catch((err) => console.log('could not connect to mongodb',err));

app.use('/api', router);

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

فایل package.json:
{
  "name": "evry-node-app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node index"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
"auto-bind": "^5.0.1",
"bcrypt": "^5.1.1",
"config": "^3.3.9",
"express": "^4.18.2",
"express-validator": "^7.0.1",
"lodash": "^4.17.21",
"mongoose": "^7.4.4",
"mongoose-timestamp": "^0.6.0"
  }
}

فایل config\default.json:
{
  "name": "evry node app",
  "db": {
"address": "mongodb://127.0.0.1:27017/test"
  }
}

فایل config\development.json:
{
  "name": "evry node app - dev"
}

فایل config\production.json:
{
  "name": "evry node app - production"
}

فایل src\models\user.js:
const mongoose = require('mongoose');
const timestamp = require('mongoose-timestamp');

const userSchema = new mongoose.Schema({
  email: {type: String, required: true, unique:true},
  name: {type: String, required: true},
  password: {type: String, required: true},
  admin: {type: Boolean, default: false},
})
userSchema.plugin(timestamp);

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

فایل src\routs\controller.js:
const {validationResult} = require('express-validator')
const User = require('./../models/user');

module.exports = class {
  constructor(){
this.User = User;
  }
  validatonBody(req,res){
const result = validationResult(req);
if(!result.isEmpty()){
  const errors = result.array();
  const massege = [];
  errors.forEach(err => massege.push(err.msg));
  res.status(400).json({
    massege: 'validaton error',
    data: massege
  })
  return false;
}
return true;
  }

  validate(req,res,next){
if(!this.validatonBody(req,res)){
  return;
}
next();
  }

  response({res , massege , code=200 , data={}}){
res.status(code).json({
  massege,
  data
})
  }
}

فایل src\routs\index.js:
const express = require('express');
const router = express.Router();
const authRouter = require('./auth');

router.use('/auth' , authRouter);

module.exports = router; 

فایل src\routs\auth\controller.js:
const controller = require('./../controller')
const _ = require('lodash');
const bcrypt = require('bcrypt');

module.exports = new (class extends controller {
  async register(req,res){
let user = await this.User.findOne({email: req.body.email});
if(user){
  return this.response({
    res, code: 400, massege: 'this user is registered'
  });
}
user = new this.User(_.pick(req.body, ["name", "email", "password"]));

const solt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(user.password, solt);

await user.save();

this.response({
  res, massege: "the user registered",
  data: _.pick(user, ["_id", "name", "email"])
})
  }
  async login(req,res){
res.send('login');
this.User;
  }
})();

فایل src\routs\auth\index.js:
const express = require('express');
const router = express.Router();
const controller = require('./controller');
const validator = require('./validator')

router.post(
  '/register',
  validator.registerValidator(),
  controller.validate,
  controller.register.bind(this)
)

router.post(
  '/login',
  validator.loginValidator(),
  controller.validate,
  controller.login.bind(this)
)

module.exports=router;

فایل src\routs\auth\validator.js:
const expressValidator = require('express-validator');
const check = expressValidator.check;

module.exports = new class {
  registerValidator(){
return[
  check('email')
    .isEmail()
    .withMessage('email id invalid')
    .not()
    .isEmpty()
    .withMessage('email cant be empety'),
    check('name')
      .not()
      .isEmpty()
      .withMessage('name cant be empety'),
    check('password')
      .not()
      .isEmpty()
      .withMessage('password cant be empety'),
  ]
  }
  loginValidator(){
return[
  check('email')
    .isEmail()
    .withMessage('email id invalid')
    .not()
    .isEmpty()
    .withMessage('email cant be empety'),
    check('password')
      .not()
      .isEmpty()
      .withMessage('password cant be empety'),
  ]
  }
}

حالا تو تمام محتوا پروژه من را داری. حالا بگو چرا زمانی که آن را اجرا می کنم به درستی اجرا می شود ولی زمانی که به این آدرس "http://localhost:5000/api/auth/register" درخواست POST می فرستم و محتوا body را به صورت زیر وارد میکنم:

{  
"email": "rouzbeh@gmail.com",  
"name": "rouzbeh",  
"password": "1234"  
}

ارور زیر را می دهد

TypeError: Cannot read properties of undefined (reading 'validatonBody')  
at validate (C:\\Users\\rayanastore\\Desktop\\evry node app\\src\\routs\\controller.js:24:14)  
at Layer.handle \[as handlerequest\] (C:\\Users\\rayanastore\\Desktop\\evry node app\\nodemodules\\express\\lib\\router\\layer.js:95:5)  
at next (C:\\Users\\rayanastore\\Desktop\\evry node app\\nodemodules\\express\\lib\\router\\route.js:144:13)  
at middleware (C:\\Users\\rayanastore\\Desktop\\evry node app\\nodemodules\\express-validator\\src\\middlewares\\check.js:16:13)  
at process.processTicksAndRejections (node:internal/process/taskqueues:95:5)

ثبت پرسش جدید

به همدیگه کمک کنیم

به روزبه فرتاج کمک کنید تا مشکل خودش را حل کند؛ این‌طور می‌توانیم با هم پیشرفت کنیم.

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام