ES进口护照

ES import passport

谁能帮我用ES导入版的:require('./config/passport')(passport);。我无法让它工作。我不认为你可以同时使用 ES import 和 require 。我得到了 require is undefined 的错误。

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());

是的,我们不能使用 commonjs 模块的 require 和 ES6 模块的 import。 虽然解决方案非常简单。基本上,您必须将 passport 作为参数传递给从 ./config/passport 导出的函数。 您所要做的就是按原样导入函数并将护照作为参数传递。

所以这是你需要做的:-


config/passport.js

export default = (passport) => {
 /* use passport here */
}

index.js

import passport from "passport";
import passportConfig from "./config/passport";

passportConfig(passport);

Aryaman 是正确的,但我想提供一个稍微不同的解决方案。

我建议您尽可能将通行证逻辑放在主 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;