ES импортный паспорт

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