‘app.use () требует функции промежуточного программного обеспечения’ — Ошибка паспорта и узла

#javascript #node.js #express #passport.js

#javascript #node.js #экспресс #passport.js

Вопрос:

Я пытаюсь добавить локальную аутентификацию в свой 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('/');
    });
}
  

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

Ответ №1:

В 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 };
  

Это поможет вам.

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

1. Спасибо! В изменениях в app.js у вас есть маршрутизатор во второй строке… где это объявлено? У меня нет маршрутизатора в моем app.js Я попытался передать приложение вместо маршрутизатора, но это выдает ошибку Cyclical__proto__value.

Ответ №2:

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

Из express docs: функции промежуточного программного обеспечения — это функции, которые имеют доступ к объекту запроса (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);
  

Используйте Express 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");