[英]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()
但仍然有同樣的問題。
我在這里看到兩件錯誤的事情:
由於傳遞索引方法的方式,您在索引方法中丟失了controller
object。
你正在用(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.