Ошибка в Express, не удается отправить запрос

#mongodb #express #ecmascript-6

#mongodb #экспресс #ecmascript-6

Вопрос:

controllers/userController.js

 import User from '../models/userModel.js'
import asyncHandler from 'express-async-handler'
import generateToken from '../utils/generateToken.js'

// @desc    Auth user amp; get token
// @route   POST /api/users/login
// @access  Public
const authUser = asyncHandler(async(req, res) => {
  const { email, password } = req.body

  const user = await User.findOne({ email })
  if(user amp;amp; (await user.matchPassword(password))) {
    res.json({
      _id: user._id,
      name: user.name,
      email: user.email,
      isAdmin: user.isAdmin,
      token: generateToken(user._id)
    })
  } else  {
    res.status(401)
    throw new Error('Invalid email or Password')
  }
})

// @desc    Get user Profile
// @route   GET /api/users/login
// @access  Private
const getUserProfile = asyncHandler(async(req, res) => {
  // res.json(req.user)
  const user = await User.findById(req.user._id)
  console.log('user', user)
  if (user) {
    res.json(user)
  } else {
    res.status(404)
    throw new Error('User not Found')
  }
})

export { authUser, getUserProfile }
 

middleware/errorMiddleWare.js

 const notFound = (req, res, next) => {
  const error = new Error(`Not Found - ${req.originalUrl}`)
  res.status(404)
  next(error)
}

const errorHandler = (err, req, res, next) => {
  const statusCode = res.statusCode === 200 ? 500 : res.statusCode
  res.status(statusCode)
  res.json({
    message: err.message,
    stack: process.env.NODE_ENV === 'production' ? null : err.stack
  })
}

export { notFound, errorHandler }
 

middleware/authMiddleware.js

 import jwt from 'jsonwebtoken'
import asyncHandler from 'express-async-handler'
import User from '../models/userModel.js'

const protect = asyncHandler(async(req, res, next) => {
  let token
  if(req.headers.authorization amp;amp; req.headers.authorization.startsWith('Bearer')) {
    try {
      token = req.headers.authorization.split(' ')[1]
      const decoded = await jwt.verify(token, process.env.JWT_SECRET)
      req.user = await User.findById(decoded.id).select('-password')
      next()
    } catch (error) {
      res.status(401)
      throw new Error('Not Authorized, token failed')
    }
  }

  if(!token) {
    res.status(401)
    throw new Error('Not Authorized')
  }
  next()
})
export { protect }
 

routes/userRoutes.js

 import express from 'express'
const router = express.Router()
import { authUser, getUserProfile } from '../controllers/userController.js'
import { protect } from '../middleware/authMiddleware.js'

router.post('/login', authUser)
router.route('/profile').get(protect, getUserProfile)

export default router
 

Я получил ошибку в userController.js , ошибка из моего errorMiddleware.
Сценарий :

  1. Если я отправлю ответ из «if statement». (после User.findById) введите описание изображения здесь
  2. Но если я отправлю ответ до «if statement», он сработает (не очень хорошо). Но почему? и как я могу это решить (отправить ответ после использования User.findById)?
  3. Я получил ошибку в консоли сервера, когда использовал сценарий 1 или 2. введите описание изображения здесь

версия node 14.12.0 express 4.17.1

Комментарии:

1. Вы импортировали пользовательскую модель в свой контроллер таким образом? импортировать пользователя из ‘../models/userModel.js «И, пожалуйста, покажите код промежуточного программного обеспечения protect. Я думаю, что может быть проблема.

2. да, @IbadShaikh. Я отредактировал свой пост.

3. Внутри консоли сервера он указывает на ошибку в userController.js в строке 34. Проверьте там, отправили ли вы заголовки дважды.

Ответ №1:

Готово, я забыл удалить next() в middleware/authMiddleware.js чтобы защитить getUserProfile.