#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");