【问题标题】:TypeError: Cannot read property 'passport' of undefined nodejsTypeError:无法读取未定义 nodejs 的属性“护照”
【发布时间】:2021-11-19 17:01:08
【问题描述】:

我目前正在使用 Express、Node、Mongoose 和 Passport.js 开发注册和登录系统,并且注册大部分工作正常,但是登录系统存在一个大问题。由于某种原因,在我创建护照的方法中无法读取未定义的“护照”,因此出现了未定义的内容,但我似乎无法弄清楚。 我不知道为什么它不起作用,请任何帮助!

这是我的代码 app.js

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const cors = require('cors');
const passport = require('passport');
const mongoose = require('mongoose');
const config = require('./config/database');

mongoose.connect(config.database);

mongoose.connection.on('connected', () => {
    console.log('Connected to database ' + config.database);
});

mongoose.connection.on('error', (err) => {
    console.log('Database error:' + err);
});


const app = express();
const users = require('./routes/users');
const port = 3000;

app.use(cors());
app.use(express.static(path.join(__dirname, 'public')));

app.use(bodyParser.json());

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

app.use('/users', users);

app.get('/', (req, res) => {
 res.send('Invalid Endpoint');
});

app.listen(port, () =>{
console.log('Server started on port' + port);
});

    users.js 

const express = require('express');
const router = express.Router();
const passport = require('passport');
const jwt = require('jsonwebtoken');
const User = require('../models/user');



router.post('/register', (req, res, next) =>{
    let newUser = new User({
        name: req.body.name,
        email: req.body.email,
        username: req.body.username,
        password: req.body.password
    });

    User.addUser(newUser, (err, user) => {
        if(err){
            res.json({success: false, msg:'Failed to register user'});
        }else {
            res.json({success: true , msg:'User registered'});
        }
    });
});

router.post('/authenticate', (req, res, next) =>{
    res.send('AUTHENTICATE');
});

router.get('/profile', (req, res, next) =>{
    res.send('PROFILE');
});



module.exports = router;

【问题讨论】:

  • 请编辑您的问题,在堆栈跟踪中包含错误以及与错误相关的其他代码。根据您提供的错误消息,代码的某些部分正在访问未定义对象的属性(护照)。但是,在您提供的代码中没有这样的访问权限。

标签: node.js


【解决方案1】:

您的问题与护照会话有关。您需要在它之前使用快速会话(记住安装在您的依赖项中)才能正常工作。

您的 app.js 应如下所示:

const express = require('express');
const path = require('path');
const bodyParser = require('body-parser');
const cors = require('cors');
const passport = require('passport');
const mongoose = require('mongoose');
const config = require('./config/database');
const session = require("express-session");

mongoose.connect(config.database);

mongoose.connection.on('connected', () => {
    console.log('Connected to database ' + config.database);
});

mongoose.connection.on('error', (err) => {
    console.log('Database error:' + err);
});


const app = express();
const users = require('./routes/users');
const port = 3000;

app.use(cors());
app.use(express.static(path.join(__dirname, 'public')));

app.use(bodyParser.json());

app.use(session({secret: "secret"});

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

app.use('/users', users);

app.get('/', (req, res) => {
    res.send('Invalid Endpoint');
});

app.listen(port, () =>{
    console.log('Server started on port' + port);
});

另外,请记住,Express 4.16.0 或更高版本不推荐使用正文解析器。它已在 express.json() 和 express.urlencoded() 方法中重新添加,因此如果您的 Express 版本属于该类别,您可以将 app.js 更改为:

const express = require('express');
const path = require('path');
const cors = require('cors');
const passport = require('passport');
const mongoose = require('mongoose');
const config = require('./config/database');
const session = require("express-session");

mongoose.connect(config.database);

mongoose.connection.on('connected', () => {
    console.log('Connected to database ' + config.database);
});

mongoose.connection.on('error', (err) => {
    console.log('Database error:' + err);
});


const app = express();
const users = require('./routes/users');
const port = 3000;

app.use(cors());
app.use(express.static(path.join(__dirname, 'public')));

app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(session({secret: "secret"});

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

app.use('/users', users);

app.get('/', (req, res) => {
    res.send('Invalid Endpoint');
});

app.listen(port, () =>{
    console.log('Server started on port' + port);
});

我建议在您的代码中添加 cmets 以保持其整洁。

【讨论】:

    【解决方案2】:

    万一其他人遇到此错误:

    express-session deprecated undefined resave option; provide resave option
    express-session deprecated undefined saveUninitialized option; provide saveUninitialized option app.
    

    除了@raijin30 答案,我还必须添加以下属性(:

        resave: true,
        saveUninitialized: true
    

    原因说明,请参见:Node JS session error: express-session deprecated。

    【讨论】:

      【解决方案3】:

      有同样的问题,并注意到护照在 9 月 23 日更新。所以,我决定通过 npm 安装以前的版本使用

      npm install --save passport@0.4.1
      

      这为我解决了这个问题。不太确定它最初是如何发生或为什么发生的,但它可能会对您有所帮助。

      【讨论】:

      • 我同意。最新版本似乎有问题,所以 0.4.1 也适用于我。
      猜你喜欢
      • 2015-11-25
      • 2015-04-30
      • 2017-03-06
      • 2022-09-23
      • 2022-11-29
      • 2017-08-30
      • 2017-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多