Node.js 为什么get/post方法会抛出未经授权的(401)错误?

Node.js 为什么get/post方法会抛出未经授权的(401)错误?,node.js,mongodb,express,passport.js,express-validator,Node.js,Mongodb,Express,Passport.js,Express Validator,我有一个用于登录和注册的项目,注册部分我在其中使用了Express Validator,而登录部分我使用的是Passport.JS但是,当我在app.JS中添加Passport JS时,会抛出未经授权的错误401 app.js(导致问题的行) 这两行代码导致了这个问题,当我对它们进行注释时,它可以工作,但在这种情况下,我将无法使用Passport.js app.js(所有代码行) index.js var express = require('express'); var router = e

我有一个用于登录和注册的项目,注册部分我在其中使用了Express Validator,而登录部分我使用的是Passport.JS但是,当我在app.JS中添加Passport JS时,会抛出未经授权的错误401

app.js(导致问题的行)

这两行代码导致了这个问题,当我对它们进行注释时,它可以工作,但在这种情况下,我将无法使用Passport.js

app.js(所有代码行)

index.js

var express = require('express');
var router = express.Router();
const product = require('../model/product');
const users = require('../model/users');
const { check, validationResult } = require('express-validator');
const passport = require('passport');

/* GET home page. */
router.get('/', function(req, res, next) {
  product.find({}, (err, doc)=>{
    if(err){
      console.log('ERR while searching in DB =>' + err);
    }
      var grid = 3;
      var arr = [];
      for(var i = 0; i<doc.length; i+=grid){
        arr.push(doc.slice(i , i+grid));
      }
      console.log(arr)

    res.render('index', { title: 'Express', product : arr });
  })

});

/* router.post('/', function(req, res, next) {

}); */
//GET login
router.get('/login', (req, res, next)=>{
  res.render('login')

});
router.post('/login', passport.authenticate('local', {
  failureRedirect: '/login',
  successRedirect: '/',
  failureFlash: true,
}));

router.get('/signup', function (req, res, next){
  const msg = req.flash('error')
  res.render('signup', {messages : msg});
});
router.post('/signup',  [
    // password must be at least 5 chars long
    check('password').isLength({ min: 5 }).withMessage('Please enter Password with more than 5 letters!'),
    // username must be an email
    check('username').not().isNumeric().withMessage('please fill username with STRING only'),
    // password must be at least 5 chars long
    check('email').not().isEmpty().withMessage('please fill email with STRING only'),
    check('email').not().isEmail().withMessage('please enter valid email'),
    // password must be at least 5 chars long
    check('password').not().isEmpty().withMessage('Please fill password fie'),
    check('repassword').custom((val, {req})=>{
      if(val !== req.body.password){
        throw new Error('Password is not equal to confirm password');
      }
      return true;
    })
  ],
  function (req, res, next){

    // Finds the validation errors in this request and wraps them in an object with handy functions
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      var validationMessage = [];
    for(var i = 0; i<errors.errors.length; i++){
      validationMessage.push(errors.errors[i].msg);
    }
    req.flash('error', validationMessage)
      res.redirect('signup')
    }

    const newUser = new users({
      username : req.body.username,
      password : new users().hashPassword(req.body.password)
    });
    users.findOne({username : req.body.username}, (err, doc)=>{
      if(err){
        console.log('ERR while getting username =>' + err);
        return ;
      }
      if(doc){
        console.log('this email is already exist')
      }
    });
    newUser.save((err, doc)=>{
      if(!err){
        console.log('err')
      }else{
        console.log('ERR in saving users =>' + err);
      }
    })
});


module.exports = router;

您只需要将授权中间件应用于您的私有路由

谢谢大家,回答:

app.js(两行导致问题)必须是:

来自

//passport
app.use(passport.authorize());
app.use(passport.session()); 

//passport
app.use(passport.initialize());
app.use(passport.session());

这是因为您正在将授权中间件应用于每个路由。
{
  "name": "market",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "bcrypt": "^4.0.0",
    "connect-flash": "^0.1.1",
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "express-session": "^1.17.0",
    "express-validator": "^6.4.0",
    "hbs": "~4.0.4",
    "http-errors": "~1.6.3",
    "mongoose": "^5.9.2",
    "morgan": "~1.9.1",
    "nodemon": "^2.0.2",
    "passport": "^0.4.1",
    "passport-local": "^1.0.0"
  }
}
//passport
app.use(passport.authorize());
app.use(passport.session()); 
//passport
app.use(passport.initialize());
app.use(passport.session());