'app.use () требуется функция промежуточного программного обеспечения' - ошибка паспорта и узла - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь добавить локальную аутентификацию в мое приложение node.js.После обучения: https://scotch.io/tutorials/easy-node-authentication-setup-and-local Я столкнулся с ошибкой: «TypeError: app.use () требуется функция промежуточного программного обеспечения».

Я думаю, что это связано с app.use (indexRoutes)) в моем файле app.js, но я не уверен, как это исправить?Любая помощь будет принята с благодарностью.

Вот мой код: app.js:

var express     = require('express'),
    session     = require("express-session"),
    bodyParser  = require('body-parser'),
    app         = express().use(bodyParser.json()), //creates express http server
    passport    = require('passport'),
    sanitizer   = require('express-sanitizer'),
    mongoose    = require("mongoose"),
    cookieParser    = require('cookieparser'),
    dotnev      = require('dotenv').config(),
    https       = require('https'),
    flash       = require('connect-flash'),
    fs          = require('fs'),
    config      = require('./config/config'),
    _           = require("underscore");

require('./config/passport')(passport);
var indexRoutes = require("./routes/index")(app, passport);

app.use(bodyParser.urlencoded({extended: true}));
app.use(sanitizer());
app.use(express.static(__dirname + "/public")); //tells express to serve the contents of the public directory

app.use(cookieParser);

//no longer need to specify that the view files are .ejs
app.set("view engine", "ejs");

app.use(session({
    secret: "akjjkjnisaiuu8998323jdkadsih892rhoisdfasl",
    resave: true,
    saveUninitialized: true,
    cookie: {
        maxAge: 1200000
    }
}));

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

app.use(flash());
app.use(indexRoutes);

mongoose.connect(process.env.MONGOLAB_URL, { useNewUrlParser: true });

index.js:

var express             = require("express"),
    router              = express.Router(),
    _                   = require("underscore"),
    User                = require("../models/user"),
    auth                = require("../routes/auth"),
    config              = require('../config/config'),
    freshbooks          = require("../modules/freshbooks"),
    quickbooks          = require("../modules/quickbooks");

module.exports = function(router, passport){
    //------------------------------------//
    //***------------ROUTES------------***//
    //------------------------------------//
    router.get("/", function(req, res) {
        res.render("landing");
    });

    router.get("/register", auth.optional, function(req, res) {
        res.render("register");
    });

    router.get("/login", auth.optional, function(req, res) {
        res.render("login");
    });

    router.get("/admin", isLoggedIn, function(req, res) {
        res.render('admin', {
            user : req.user // get the user out of session and pass to template
        });
    });

    //------------------------------------//
    //***-------------AUTH-------------***//
    //------------------------------------//
    router.post('/register', passport.authenticate('local-signup', {
        successRedirect : '/admin', // redirect to the secure profile section
        failureRedirect : '/register', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

    router.post('/login', passport.authenticate('local-login', {
        successRedirect : '/profile', // redirect to the secure profile section
        failureRedirect : '/login', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

    function isLoggedIn(req, res, next) {

        // if user is authenticated in the session, carry on 
        if (req.isAuthenticated())
            return next();

        // if they aren't redirect them to the home page
        res.redirect('/');
    }

    router.get('/logout', function(req, res) {
        req.logout();
        res.redirect('/');
    });
}

Заранее спасибо залюбая помощь!

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Вы получаете эту ошибку, потому что эта функция module.exports = function(router, passport){ не является допустимым промежуточным программным обеспечением.

Из экспресс-документов : Функции промежуточного программного обеспечения - это функции, которые имеют доступк объекту запроса (req), объекту ответа (res) и следующей функции в цикле запрос-ответ приложения.

Синтаксис:

function(req, res, next) {
  // Implement the middleware function based on the options object
  next()
}

req: HTTP-аргумент ответа на функцию промежуточного программного обеспечения, который по соглашению называется res.

res: HTTP-аргумент запроса на функцию промежуточного программного обеспечения, называемый reqсоглашение.

next: Аргумент обратного вызова функции промежуточного программного обеспечения, вызываемый соглашением "next".

Когда вы вызывали эту функцию, function(router, passport){:

var indexRoutes = require("./routes/index")(app, passport);

indexRoutes, содержит возвращаемое значение function(router, passport), которое не возвращает функцию промежуточного программного обеспечения (возвращает undefined).

Два способа решения проблемы:

Изменить импорт :

// remove this line and put the below instead
app.use(cookieParser);

// and modify and move your import
require("./routes/index")(app, passport);

Использовать экспресс router: измените index.js на

// note your exports it's not a function, you're exporting this **router** object -> router = express.Router(),
module.exports = router;
//------------------------------------//
//***------------ROUTES------------***//
//------------------------------------//
router.get("/", function(req, res) {
  res.render("landing");
});

router.get("/register", auth.optional, function(req, res) {
  res.render("register");
});

...

и измените свой импорт на:

var indexRoutes = require("./routes/index");
0 голосов
/ 04 апреля 2019

В app.js

var { registerIndexRoutes } = require("./routes/index");
var indexRoutes = registerIndexRoutes(router, passport);
app.use(indexRoutes);

и index.js

const registerIndexRoutes =  function(router, passport){
    //------------------------------------//
    //***------------ROUTES------------***//
    //------------------------------------//
    router.get("/", function(req, res) {
        res.render("landing");
    });
   return router;//important;
}
module.exports = { registerIndexRoutes };

Это тебе поможет.

...