簡體   English   中英

無法通過 Express Js Router 請求和響應 Class 方法

[英]Cannot Passing Express Js Router Request and Respond to Class Method

創建 express JS 路由器時遇到問題。

我無法將 req 和 res 傳遞給我的 class 方法。

不工作app.get('/', controller.index)

工作app.get('/', (res,req) => controller.index(req,res)

下面是我做的路由的流程:
app.js(主文件)> /routes/index.js > /routes/user.route.js > /controllers/user.controller.js > /services/user.services.js

應用程序.js

import express from 'express';
import cors from 'cors';
import routes from './routes';
import db from './models';
import dotenv from 'dotenv';

dotenv.config();
const app = express();
const port = process.env.PORT || 3001;

app.use(cors())
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

// Database Initialize
db.sequelize.sync()
.then(() => {
    console.log("🚀 Database Connected.");
}).catch((err) => {
    console.log("❌ Failed Connect to Database");
})

// Router
app.use(routes);

//global dir
global.__basedir = __dirname;

app.enable("trust proxy");

app.listen(port, () => {
  // logger.info("Checking the API status: Everything is OK");
  console.log(`🚀 App listening on port ${port}`);
})

路線/index.js

import express from "express";
import appRoutes from './app.routes';
import roleRoutes from './role.routes';
import userRoutes from './user.routes';
import authRoutes from './auth.routes';

const app = express();

// App Routes
app.use('/app', appRoutes);
// Role Routes
app.use('/role', roleRoutes);
// User Routes
app.use('/user', userRoutes);
// Auth Routes
app.use('/auth', authRoutes);

export default app;

路線/user.routes.js

import express from 'express';
import userController from '../controllers/user.controller';
import validateAuth from '../middlewares/validateAuth';

const app = express();
const controller = new userController;

app.get('/', controller.index);

export default app;

控制器/user.controller.js

import userServices from "../services/user.services";
import baseController from "./base.controller";

export default class userController extends baseController {
    constructor() {
        super(new userServices());
    }
}

控制器/base.controller.js

import response from "../helpers/response";
import lang from "../helpers/lang";
import dotenv from "dotenv";
dotenv.config();

export default class baseController {
    constructor(service) {
        this.service = service
    }

    /**
     * Index
     * Get all data with pagination
     */
    async index(res, req) {
        try {
            const data = await this.service.paginate(req.query);
            if(data) {
                return response.success({
                    res,
                    message: lang[process.env.LANG].DATA_LOADED,
                    data
                });
            } else {
                throw new Error(lang[process.env.LANG].REQUEST_FAILED);
            }
        } catch(err) {
            console.log(err)
            return response.error({
                res,
                message: err.message,
            });
        }
    }
}

服務/user.services.js

import baseServices from "./base.services";
import db from "../models";

export default class userServices extends baseServices {
    constructor() {
        const attributes = [
            "roleId",
            "appId",
            "username",
            "password",
            "name",
            "phone",
            "email",
            "isActive",
        ];
        super(db.user, attributes);
    }

    /**
     * Paginate
     * @param {{
     *  search: string,
     *  limit: number,
     *  offset: number,
     *  sortBy: string,
     *  orderBy: string,
     *  user: object
     * }} data
     * return Promise
     */
    paginate(data) {
        const { search, limit, page, sortBy, orderBy, user } = data;

        const offset = limit
            ? parseInt(limit) * parseInt(page) - parseInt(limit)
            : 0;

        let filter = {};
        if (search)
            Object.assign(filter, { name: { [Op.like]: `%${search}%` } });

        const condition = {
            where: filter ? filter : "",
            order: sortBy ? [[sortBy, orderBy]] : [["name", "asc"]],
            limit: limit ? parseInt(limit) : 10,
            offset,
            include: ["role", "app"]
        };

        return this.model.findAndCountAll(condition);
    }
}

服務/base.services.js

import db from "../models";
const Op = db.Sequelize.Op;

/**
 * Base Services Class
 */
export default class baseServices {
    constructor(model, attributes = []) {
        this.model = model;
        this.attributes = attributes
    }
}

回復

不工作app.get('/', controller.index)
錯誤響應

工作app.get('/', (res,req) => controller.index(req,res)

成功響應

我試圖改變const app = express()const app = express.Router()但仍然有同樣的問題。

我在這里看到兩件錯誤的事情:

  1. 由於傳遞索引方法的方式,您在索引方法中丟失了controller object。

  2. 你正在用(req, res) arguments 的順序做一些非常混亂的事情。

您的controller.index()方法將它們反向聲明為:

async index(res, req) { ... }

所以這就是為什么:

app.get('/', controller.index)

不起作用。 因為 arguments 被 Express 作為(req, res)傳遞,但是您的方法期望它們作為(res, req)

然后,這是有效的原因:

app.get('/', (res,req) => controller.index(req,res));

是因為你又顛倒了論點。


因此,將方法更改為:

async index(req, res) { ... }

因此,它匹配 Express 傳遞 arguments 的方式,然后 arguments 將是正確的。

然后,因為你的controller object 有實例數據並且index方法使用this ,你還需要確保 index 方法通過更改為this正確地傳遞它的實例:

app.get('/', controller.index.bind(controller));

你應該遵循正確的MVC模式並跟着我重復,你的app.js應該是:

require ('dotenv').config();
const routes =  require('./routes');
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
const cors = require('cors');
const db = require('./models');

const port = process.env.PORT || 3001;

app.use(cors());
app.use(express.json());

// Database Initialize
db.sequelize.sync()
.then(() => {
    console.log("🚀 Database Connected.");
}).catch((err) => {
    console.log("❌ Failed Connect to Database");
})

// Router
app.use(routes);

//global dir
global.__basedir = __dirname;

app.enable("trust proxy");

app.listen(port, () => {
  // logger.info("Checking the API status: Everything is OK");
  console.log(`🚀 App listening on port ${port}`);
})

routes/index.js文件應遵循以下結構:

const router = require("express").Router();

router.use('/app', require(./app.routes"));
router.use('/role', require("./role.routes"));
router.use('/user', require("./user.routes"));
router.use('/auth', require("./auth.routes"));


module.exports = router;

你所有的路線文件應該是這樣的

用戶.routes

const userController = require("whatever the location");
const router = require("express").Router();

router.post("/example", userController.controller);

module.exports = router;

用戶控制器文件:

const userServices = require("what ever the location");

const controller = async (request, response) => {
    try {
        //code goes here
        await userServices.addUser(
        {
                "name": "ALI",
                "gender": "MALE",
        }
    )
    } catch (error) {
        console.log(error);
        response.status(500).json({
            error: "Something went wrong",
        });
    }
}

module.exports = {
    controller
}

最后 userServices 文件是:

const user = require("what ever the location");

const addUser = async (data) => {

    return new Promise((resolve, reject) => {
        new user(data)
            .save()
            .then((data) => resolve(data))
            .catch((err) => reject(err));
    });

}

module.exports = {
    addUser
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM