只是在这里寻求一些建议。我正在熟悉 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 为您提供帮助