0

只是在这里寻求一些建议。我正在熟悉 Nuxt.js,以提高我的“前端”技能。我已经使用 Express.js 开发了一个非常经典的后端,并希望将该后端用于 Nuxt.js 网络应用程序。

我当前的后端架构如下:

  • 我对所有身份验证和会话过程使用 Passport Local Strategy 身份验证。
  • 我有几个中间件可以检查并验证每当我访问资源时,我都已连接。
  • 我有几条路线:
    • 我可以在其中注册、登录、注销和获取当前连接的用户的“/auth/”。
    • CRUD 操作应用于当前连接的用户和其他用户的“/user/”。
    • 以及与这里的主题无关的最终路线。

我使用 nuxt.config.js 进行了第一次试用:

import colors from "vuetify/es5/util/colors";

export default {
  // Global page headers: https://go.nuxtjs.dev/config-head
  head: {
    titleTemplate: "%s - concept-slide",
    title: "concept-slide",
    htmlAttrs: {
      lang: "en"
    },
    meta: [
      { charset: "utf-8" },
      { name: "viewport", content: "width=device-width, initial-scale=1" },
      { hid: "description", name: "description", content: "" }
    ],
    link: [{ rel: "icon", type: "image/x-icon", href: "/favicon.ico" }]
  },

  // Global CSS: https://go.nuxtjs.dev/config-css
  css: [],

  // Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins
  plugins: [],

  // Auto import components: https://go.nuxtjs.dev/config-components
  components: true,

  // Modules for dev and build (recommended): https://go.nuxtjs.dev/config-modules
  buildModules: [
    // https://go.nuxtjs.dev/vuetify
    "@nuxtjs/vuetify"
  ],

  // Modules: https://go.nuxtjs.dev/config-modules
  modules: ["@nuxtjs/axios", "@nuxtjs/auth", "@nuxtjs/proxy"],
  auth: {
    redirect: {
      login: "/login",
      logout: "/"
    },
    strategies: {
      local: {
        endpoints: {
          login: {
            url: "/auth/login",
            method: "post",
            propertyName: false
          },
          logout: {
            url: "/auth/logout",
            method: "get"
          },
          user: {
            url: "/auth/me",
            method: "get",
            propertyName: false
          }
        },
        tokenRequired: false,
        tokenType: false
      }
    }
  },

  axios: {
    prefix: "/server",
    proxy: true,
    credentials: true
  },

  proxy: {
    "/server": {
      target: "http://localhost:3000/",
      pathRewrite: { "^/server": "" }
    }
  },

  router: {
    middleware: ["auth"]
  },

  serverMiddleware: [{ path: "/server", handler: "~/server/server.js" }],

  // Vuetify module configuration: https://go.nuxtjs.dev/config-vuetify
  vuetify: {
    customVariables: ["~/assets/variables.scss"],
    theme: {
      dark: true,
      themes: {
        dark: {
          primary: colors.blue.darken2,
          accent: colors.grey.darken3,
          secondary: colors.amber.darken3,
          info: colors.teal.lighten1,
          warning: colors.amber.base,
          error: colors.deepOrange.accent4,
          success: colors.green.accent3
        }
      }
    }
  },

  // Build Configuration: https://go.nuxtjs.dev/config-build
  build: {}
};

现在,据我了解,所有使用“/server”前缀的请求都应该重新路由到路由的后缀,但我一直面临用户未连接时发生的错误。

然而,原来的路线仍然有效......所以我很困惑。

仅供参考,这是我的路线:

const { isConnected } = require("../middleware/is.connected");

module.exports = function (app, passport) {
  const userRouter = require("./user.endpoints");
  const authRouter = require("./auth.endpoints")(passport);
  const conceptRouter = require("./concept.endpoints");
  const logger = require("../log/winston.logger");
  const logLevels = require("../log/log.levels.json").levels;
  app.use(function (req, res, next) {
    logger(req.method + " " + req.url, logLevels.http);
    next();
  });
  app.use("/auth", authRouter);
  app.use(isConnected);
  app.use("/api/user", userRouter);
  app.use("/api/concept", conceptRouter);
};

而 authRouter 是:

// @ts-nocheck
const express = require("express");
const router = express.Router();
const ErrorMiddleware = require("../middleware/error.middleware");
const { isAValidInstance } = require("../utils/schema.validator");
const userSchema = require("../database/schemas/user.schema.json");
const User = require("../database/models/user.model");
const logger = require("../log/winston.logger");
const SHA256 = require("js-sha256");
const logLevels = require("../log/log.levels.json").levels;
const ResponseError = require("../responses/response.error");
const ResponseSuccess = require("../responses/response.success");
const { isConnected } = require("../middleware/is.connected");

module.exports = function(passport) {
  router.get(
    "/logout",
    isConnected,
    ErrorMiddleware(function(req, res, next) {
      req.logout();
      res.clearCookie("connect.sid", {
        path: "/"
      });
      // eslint-disable-next-line node/handle-callback-err
      req.session.destroy(function(err) {
        ResponseSuccess.success(res);
      });
    })
  );

  router.get(
    "/me",
    isConnected,
    ErrorMiddleware(async (req, res, next) => {
      ResponseSuccess.success(res, req.user);
    })
  );

  router.post(
    "/login",
    passport.authenticate("local", {
      successRedirect: "/me",
      failureRedirect: "/login"
    })
  );
  router.post(
    "/signup",
    ErrorMiddleware(async (req, res, next) => {
      if (req.user !== undefined) {
        res.redirect("/api/user/me");
        return;
      }
      const user = req.body;
      if (!isAValidInstance(user, userSchema)) {
        logger("POST /auth/signup", logLevels.warn, "Invalid body");
        ResponseError.badRequest(res);
        return;
      }
      user.password = SHA256(user.password);
      const createdUser = await User.createUser(user);
      if (createdUser !== null) {
        ResponseSuccess.success(res, createdUser);
      } else {
        ResponseError.unauthorized(res);
      }
    })
  );
  return router;
};

TIA 为您提供帮助

4

0 回答 0