পাসপোর্ট.জেএস পাসপোর্ট.initialize () মিডলওয়্যার ব্যবহার হয় না


103

আমি এক্সপ্রেস + মঙ্গুজের সাথে নোড ব্যবহার করছি এবং বিশ্রামের এপিআই সহ পাসপোর্ট.জেএস ব্যবহার করার চেষ্টা করছি।
প্রমাণীকরণের সাফল্যের পরে আমি এই ব্যতিক্রমটি পেতে থাকি (আমি ব্রাউজারে কলব্যাক url দেখতে পাই):

/Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/utils.js:419
        throw err;
              ^
Error: passport.initialize() middleware not in use
    at IncomingMessage.req.login.req.logIn (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/http/request.js:30:30)
    at Context.module.exports.delegate.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/middleware/authenticate.js:194:13)
    at Context.actions.success (/Users/naorye/dev/naorye/myproj/node_modules/passport/lib/passport/context/http/actions.js:21:25)
    at verified (/Users/naorye/dev/naorye/myproj/node_modules/passport-facebook/node_modules/passport-oauth/lib/passport-oauth/strategies/oauth2.js:133:18)
    at Promise.module.exports.passport.use.GitHubStrategy.clientID (/Users/naorye/dev/naorye/myproj/config/passport.js:91:24)
    at Promise.onResolve (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8)
    at Promise.EventEmitter.emit (events.js:96:17)
    at Promise.emit (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38)
    at Promise.fulfill (/Users/naorye/dev/naorye/myproj/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20)
    at /Users/naorye/dev/naorye/myproj/node_modules/mongoose/lib/query.js:1822:13

আমি পড়েছি যে আমার রাখা উচিত app.use(passport.initialize());এবং এর app.use(passport.session());আগে app.use(app.router);এবং আমি এটি করেছি। এখানে আমার এক্সপ্রেস.জেগুলি যা মিডলওয়্যারগুলি রেজিস্টার করে:

var express = require('express'),
    mongoStore = require('connect-mongo')(express),
    flash = require('connect-flash'),
    helpers = require('view-helpers');

module.exports = function (app, config, passport) {
    app.set('showStackError', true);
    // should be placed before express.static
    app.use(express.compress({
        filter: function (req, res) {
            return /json|text|javascript|css/.test(res.getHeader('Content-Type'));
        },
        level: 9
    }));
    app.use(express.favicon());
    app.use(express.static(config.root + '/public'));

    app.use(express.logger('dev'));

    // set views path, template engine and default layout
    app.set('views', config.root + '/app/views');
    app.set('view engine', 'jade');

    app.configure(function () {
        // use passport session
        app.use(passport.initialize());
        app.use(passport.session());

        // dynamic helpers
        app.use(helpers(config.app.name));

        // cookieParser should be above session
        app.use(express.cookieParser());

        // bodyParser should be above methodOverride
        app.use(express.bodyParser());
        app.use(express.methodOverride());

        // express/mongo session storage
        app.use(express.session({
            secret: 'linkit',
            store: new mongoStore({
                url: config.db,
                collection : 'sessions'
            })
        }));

        // connect flash for flash messages
        app.use(flash());

        // routes should be at the last
        app.use(app.router);

        // assume "not found" in the error msgs
        // is a 404. this is somewhat silly, but
        // valid, you can do whatever you like, set
        // properties, use instanceof etc.
        app.use(function(err, req, res, next){
            // treat as 404
            if (~err.message.indexOf('not found')) {
                return next();
            }

            // log it
            console.error(err.stack);

            // error page
            res.status(500).render('500', { error: err.stack });
        });

        // assume 404 since no middleware responded
        app.use(function(req, res, next){
            res.status(404).render('404', {
                url: req.originalUrl,
                error: 'Not found'
            });
        });
    });
};

কি সমস্যা?

@ পিটার লাইন্স অনুসারে আপডেট করুন আমি কনফিগারেশনের ক্রমটি নিম্নলিখিতটিতে পরিবর্তন করেছি, তবে আমি এখনও একই ত্রুটি পেয়েছি:

var express = require('express'),
    mongoStore = require('connect-mongo')(express),
    flash = require('connect-flash'),
    helpers = require('view-helpers');

module.exports = function (app, config, passport) {
    app.set('showStackError', true);
    // should be placed before express.static
    app.use(express.compress({
        filter: function (req, res) {
            return /json|text|javascript|css/.test(res.getHeader('Content-Type'));
        },
        level: 9
    }));
    app.use(express.favicon());
    app.use(express.static(config.root + '/public'));

    app.use(express.logger('dev'));

    // set views path, template engine and default layout
    app.set('views', config.root + '/app/views');
    app.set('view engine', 'jade');

    app.configure(function () {

        // dynamic helpers
        app.use(helpers(config.app.name));

        // cookieParser should be above session
        app.use(express.cookieParser());

        // bodyParser should be above methodOverride
        app.use(express.bodyParser());
        app.use(express.methodOverride());

        // express/mongo session storage
        app.use(express.session({
            secret: 'linkit',
            store: new mongoStore({
                url: config.db,
                collection : 'sessions'
            })
        }));

        // connect flash for flash messages
        app.use(flash());

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

        // routes should be at the last
        app.use(app.router);

        // assume "not found" in the error msgs
        // is a 404. this is somewhat silly, but
        // valid, you can do whatever you like, set
        // properties, use instanceof etc.
        app.use(function(err, req, res, next){
            // treat as 404
            if (~err.message.indexOf('not found')) {
                return next();
            }

            // log it
            console.error(err.stack);

            // error page
            res.status(500).render('500', { error: err.stack });
        });

        // assume 404 since no middleware responded
        app.use(function(req, res, next){
            res.status(404).render('404', {
                url: req.originalUrl,
                error: 'Not found'
            });
        });
    });
};

এক্সপ্রেস 4.x সংস্করণ কিছু পদ্ধতি সমর্থন করে না। গিথুব
এক্সপ্রেস /

উত্তর:


206

আউট অফ-অর্ডার মিডলওয়্যার হেল্প এড়ানোর জন্য উদাহরণটি অনুসরণ করুন যা এক্সপ্রেসকে এত সহজে প্রবেশ করায়। সরাসরি ডক্স থেকে আপনার কীভাবে এটি ঠিক মেলে না তা নোট করুন।

var app = express();
app.use(require('serve-static')(__dirname + '/../../public'));
app.use(require('cookie-parser')());
app.use(require('body-parser').urlencoded({ extended: true }));
app.use(require('express-session')({
  secret: 'keyboard cat',
  resave: true,
  saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());

ডক্স

  1. cookieParser
  2. সেশন
  3. passport.initialize
  4. passport.session
  5. app.router

আপনি

  1. passport.initialize
  2. passport.session
  3. cookieParser
  4. সেশন
  5. app.router

আপনার পরামর্শ অনুসারে আমি এটি পরিবর্তন করেছি তবে এটি এখনও এই ত্রুটি ছুঁড়ে দেয়। আমি নতুন এক্সপ্রেস.জেএস ফাইল /
নাওর

7
সুতরাং আপনার এখানে কোডটি আপনার শীর্ষ-স্তরের কোড নয়। আপনার প্রোগ্রাম এর আগে আপনাকে কোনো কল করা হয় app.get, app.post, ইত্যাদি? এগুলি রাউটারটিকে আপনার ইচ্ছার চেয়ে আগে স্ট্যাকের সাথে যুক্ত করবে। আপনি যখন express()আপনার appঅবজেক্টটি পেতে ফাংশনটি শুরু করবেন তখনই আমাদের সমস্ত রিভ্যান্ট কোডটি দেখান । এটা আমার দ্বিতীয় অনুমান।
পিটার লিয়নস

3
আমি লক্ষ্য করেছি যে অ্যাপ.ইউজ (app.router); পাসপোর্ট আরম্ভ করার পরে বলা হয় তবে আমি কল করি: প্রয়োজনীয় ('./ কনফিগার / রুট') (অ্যাপ, পাসপোর্ট, লেখক); কনফিগারেশন প্রকাশ করতে কল করার আগে। উভয় লাইনের মধ্যে স্যুইচিং সমস্যার সমাধান করে। ধন্যবাদ!
নাওর

1
এটি আমার পক্ষে কাজ করেছিল! তবে মিডলওয়্যারগুলি কেন এমনভাবে হতে হবে?
অ্যান্টনি

3
নকশা দ্বারা যাতে আপনি সম্পন্ন করা পূর্বশর্ত উপর নির্ভর করতে পারেন। যদি কুকি পার্সার এখনও কুকিগুলি পার্স করে না তবে সেশনটি কাজ করবে না।
পিটার লিয়নস

12

আমার ক্ষেত্রে (একই ত্রুটির বার্তা) আমি পাসপোর্ট সূচনাটি মোটেও যোগ করতে ভুলে গেছি:

app.configure(function () {
    ...
    app.use(passport.initialize());
    app.use(passport.session());
});

আপডেট: কেবলমাত্র সংস্করণ 3 প্রকাশের জন্য কাজ করা, সংস্করণ 4 অ্যাপ্লিকেশনটিকে কনফিগার () সমর্থন করে না


1
App.configure আর ব্যবহার করা যাবে না। github.com / স্ট্রংলুপ / ​​এক্সপ্রেস / উইকি / .. .. তাদের পাসপোর্ট ডক্স আপডেট করা উচিত। ঠিক আছে?
জ্যাক ফাঁকা

9

আমার ক্ষেত্রে ত্রুটিটি ছিল কারণ আমি req.loginবাধ্য thisনা করেই কথা বলার চেষ্টা করছিলাম req, সুতরাং যখন ফাংশনটি বলা হয়েছিল তখন সেটিংসটি খুঁজে পেল না passport। আপনি নোড ভি 8 ব্যবহার করছেন কিনা req.login.bind(req)তা সমাধান করার আগে সমাধানটি বাধ্যতামূলক promisify


এবং এই "স্কপ ইস্যু" ঘটে যেমন আপনি যখন প্রথম আর্গুমেন্ট হিসাবে function({ login })পাস করার মতো ধ্বংসাত্মক যুক্তি ব্যবহার করেন req। আপনার সমাধানটি আমার পক্ষে কাজ করেছে, ধন্যবাদ
ম্যানুয়েল ডি ইওরিও

হ্যাঁ এটি thisজাভাস্ক্রিপ্টে কীভাবে কাজ করে। আপনি যদি ফাংশনটিকে অবজেক্ট পদ্ধতি হিসাবে কল না করেন তবে thisতা হবে undefined(বা windowব্রাউজারে)
জিয়া হু

যে কেউ এই উত্তর পড়া এবং এটি বুঝতে ... যদি আপনি তদন্ত না করার জন্য টিপ Function.prototype.call, Function.prototype.applyকীভাবেthis জাভাস্ক্রিপ্ট মধ্যে কাজ করে এবং prototypical এর উত্তরাধিকার এর মূল নীতি, আপনি প্রক্রিয়ায় :) জাভাস্ক্রিপ্ট গুরু স্তরে উন্নীত করা হবে
Stijn De Witt

চিয়ার্স, আমি আশা করছিলাম এটি util.promisify(req.login.bind(req));
জুলিয়ান এইচ লাম

4

কী আমাকে কুকি কনফিগারেশনের পরে রুট স্থাপনে সহায়তা করেছিল :

// init Cookies:
app.use(
    cookieSession({
        maxAge: 30 * 24 * 60 * 60 * 1000,
        keys: [keys.cookieKey]
    })
);
app.use(passport.initialize());
app.use(passport.session());

// init routes
const authRoutes = require("./routes/authRoutes")(app);

কোনও ধারণা পেল যে কনফিগারেশনের কাজ করার পরে এই আরটি রুটগুলি কেন?
ইশু

এটি আমার সমস্যাটি স্থির করেছে। আমি পাসপোর্ট সম্পর্কিত যে কোনও পরে সমস্ত রুটস ব্যবহার করেছি moved
নিক ভ্যান ব্রান্ট

2

পিটার লিয়োনসের উত্তর আমাকে এটি সমাধান করতে সহায়তা করেছিল, তবে আমি একে একে অন্যভাবে সমাধান করেছি।

app.use(
  cookieSession({
    maxAge: 30 * 24 * 60 * 60 * 1000,
    keys: [keys.cookieKey],
  }),
);
app.use(passport.initialize());
app.use(passport.session());

পুরো কোডের জন্য আমার গিটহাব রেপোটি দেখুন এবং এখানে কোড স্নিপেটই নয়।


1

আমার ক্ষেত্রে (একই ত্রুটি বার্তা), আমি একটি কাস্টম কৌশল বিকাশ করছিলাম এবং আমার একটি সেশন ব্যবহার করার দরকার নেই । আমি session: falseআমার রুটের authenticateমিডওয়্যারটি যুক্ত করতে ভুলে গেছি ।

  app.post('/api/public/auth/google-token',
    passport.authenticate('google-token', {
      session: false
    }),
    function (req: any, res) {
      res.send("hello");
    }
  );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.