#javascript #node.js #passport.js
Вопрос:
Может ли кто-нибудь помочь мне использовать импортную версию ES: require(‘./config/passport’)(паспорт);. Я не могу заставить это работать. Я не думаю, что вы можете использовать как импорт, так и требование одновременно. Я получаю и ошибку, которая требует, не определена.
import express from 'express';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';
import cors from 'cors';
import dotenv from 'dotenv';
import { createRequire } from 'module';
const URL = createRequire(import.meta.url);
import passport from 'passport'
import postRoutes from './routes/posts.js'
import userRoutes from './routes/user.js'
import loginRoutes from './routes/login.js'
const app = express();
dotenv.config();
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());
Ответ №1:
Да, мы не можем использовать require, который является модулями commonjs, с импортом, который является модулями ES6. Хотя решение действительно простое. В принципе, вы должны передать passport
в качестве аргумента экспортируемую функцию ./config/passport
. Все, что вам нужно сделать, это просто импортировать функцию как есть и передать passport в качестве аргумента.
Итак, вот что вам нужно сделать:-
config/passport.js
export default = (passport) => {
/* use passport here */
}
index.js
import passport from "passport";
import passportConfig from "./config/passport";
passportConfig(passport);
Ответ №2:
Арьяман прав, но я хотел бы предложить несколько другое решение.
Я бы рекомендовал вам app.js/ index.js
как можно больше исключить логику паспортов из основного файла. Я создаю config
папку с основной passport.js
, а затем strategies
папку, в которой есть логика того, как пользователи будут входить в систему.
в вашем основном файле точки входа, например app.js
запустите приложение для передачи конфигурации passport.
import express from 'express';
const app = express();
require('./src/config/passport')(app);
Ваш конфигурационный файл, например: passport.js
должен выглядеть следующим образом
import passport from 'passport';
require('./strategies/local.strategy')(); //Or whatever strategy you are using
const passportConfig = (app) => {
app.use(passport.initialize());
app.use(passport.session());
// stores user to session
passport.serializeUser((user, done) => {
done(null, user);
});
// retrieves user from session
passport.deserializeUser((user, done) => {
done(null, user);
});
};
export default passportConfig;
Пример локальной стратегии, также известной как пользовательская стратегия
import passport from 'passport';
import { Strategy } from 'passport-local';
import axios from 'axios';
const localStrategy = () => {
passport.use(new Strategy(
{
usernameField: 'userName',
passwordField: 'password',
},
(username, password, done) => {
const loginUrl = `${process.env.base_url}/api/core/security/login`;
const body = {
InstanceName: process.env.instance_name,
Username: username,
UserDomain: process.env.user_domain,
Password: password,
};
axios.post(loginUrl, body)
.then((response) => {
if (response.data.IsSuccessful === true) {
const user = {
token: response.data.RequestedObject.SessionToken,
userId: response.data.UserId,
userName: username,
};
done(null, user);
} else {
// handle failed login
}
})
.catch((error) =>
//Handle the error
}
))
}
export default localStrategy;