不能通过Express Js的路由器请求和响应类方法



我在创建express JS路由器时遇到了一个问题。

我不能把request和res传递给我的类方法。

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

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

下面是我所做的路由流程:
app.js(主文件)>/线路/index.js比;/线路/user.route.js比;/控制器/user.controller.js比;/服务/user.services.js

app.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
}
}

<反应/strong>

<不工作/strong>app.get('/', controller.index)
错误响应

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

成功响应我试图改变const app = express()const app = express.Router(),但仍然有同样的问题。

我觉得这里有两点不对:

  1. 您正在丢失索引方法中的controller对象,因为您传递索引方法的方式。

  2. 你对(req, res)参数的顺序做了一些非常令人困惑的事情。

您的controller.index()方法将它们反向声明为:

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

所以,这就是为什么:

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

是行不通的。因为Express将参数传递为(req, res),但您的方法期望它们为(res, req)

然后,这个工作的原因:

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

是因为你再次反转了参数


因此,将方法更改为:

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

因此,它匹配Express传递参数的方式,然后参数将是正确的。

然后,因为你的controller对象有实例数据,index方法使用this,你还需要确保索引方法在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}`);
})

路线/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;

你的所有路由文件应该是这样的

user.routes

const userController = require("whatever the location");
const router = require("express").Router();
router.post("/example", userController.controller);
module.exports = router;

userController文件:

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
}

最新更新