如何解决Express v4路由器为类
应用程序编译无误,并说服务器在正确的端口上启动。但是,当我去任何一条注册的路线时,都会收到一条无法访问此路线的错误消息。
我还没有找到关于Express与类的更多信息,尤其是路由器部分。从router变量的console.log(controller.router)
看来是正确的,缺少它的路径很奇怪,但是我认为正则表达式代替了。
this.router
实例上也没有path方法,所以我不确定get(path,handler)
以外的其他路径。
console.log(`/v1${controller.basePath}`,controller.router):
""""
/v1/users [Function: router] {
params: {},_params: [],caseSensitive: undefined,mergeParams: undefined,strict: undefined,stack: [
Layer {
handle: [Function: bound dispatch],name: 'bound dispatch',params: undefined,path: undefined,keys: [],regexp: /^\/users\/?$/i,route: [Route]
},Layer {
handle: [Function: bound dispatch],keys: [Array],regexp: /^\/users\/(?:([^\/]+?))\/?$/i,route: [Route]
}
]
}
"""
我也尝试使用localhost:1337/v1/users/
,以防万一,但同样的事情也会发生。
我不知道该怎么办,谢谢您的提前帮助!
应用程序类
import * as express from "express"
import * as mongoose from "mongoose"
import * as bodyParser from "body-parser"
mongoose.connect("mongodb://localhost:27017/socketpro",{
useUnifiedTopology: true,useNewUrlParser: true,useCreateIndex: true,})
class App {
public port: number
public app: express.Application
private controllers: any
constructor(controllers: any,port: number) {
this.port = port
this.controllers = controllers
this.app = express()
this.initializeMiddlewares()
this.initializeControllers()
}
private initializeMiddlewares() {
this.app.use(bodyParser.json())
}
private initializeControllers() {
this.controllers.forEach((controller: any) => {
console.log(`/v1${controller.basePath}`,controller.router)
this.app.use(`/v1${controller.basePath}`,controller.router)
})
}
public listen() {
this.app.listen(this.port,() => {
console.log(`App listening on the port ${this.port}`)
})
}
}
export default App
用户控制器
import { UserModel as User,UserInterface } from "../Utils/User"
import { Router,Request,Response } from "express"
export default class UsersController {
[x: string]: any
public basePath = "/users"
public router: Router = null
private posts: UserInterface[] = []
constructor() {
this.router = Router()
this.intializeRoutes()
}
public intializeRoutes() {
let routes = [
{
path: "/",method: "get",function: "GetUsers",},{
path: "/",method: "post",function: "CreateUser",{
path: "/:id",function: "GetUser",function: "UpdateUser",]
routes.map((route) => {
let path = `${this.basePath}${route.path ?? ""}`
switch (route.method) {
case "get":
this.router.get(path,this[route.function])
break
case "post":
this.router.post(path,this[route.function])
break
}
})
}
async GetUser(request: Request,response: Response) {
let userId: string = request.params.id
let user = await User.findOne({
_id: userId,})
response.send({
user,})
}
async GetUsers(request: Request,response: Response) {
response.send({status: true})
}
async CreateUser(request: Request,response: Response) {
let user: UserInterface = new User(request.body)
user = await user.save()
response.send(user)
}
async UpdateUser(request: Request,response: Response) {
let body: UserInterface = request.body
await User.updateOne(
{
_id: request.params.id,body
).exec()
response.send({
status: true,})
}
}
代码回购:https://github.com/Rusherz/express-router-class
Chrome URL showing: localhost:1337/v1/users and the error: Cannot GET /v1/users
解决方法
我的代码的问题是范围界定,或者我认为是范围界定。
我发现我基于https://dev.to/aligoren/developing-an-express-application-using-typescript-3b1
代码存在的问题是控制器文件中的
async GetUser(request: Request,response: Response) {
let userId: string = request.params.id
let user = await User.findOne({
_id: userId,})
response.send({
user,})
}
代替:
GetUser = async (request: Request,response: Response) => {
let userId: string = request.params.id
let user = await User.findOne({
_id: userId,})
}
另一种解决方案是更改:
switch (route.method) {
case "get":
this.router.get(path,this[route.function])
break
case "post":
this.router.post(path,this[route.function])
break
}
收件人:
switch (route.method) {
case "get":
this.router.get(path,this[route.function].bind(this))
break
case "post":
this.router.post(path,this[route.function].bind(this))
break
}
以防万一将来有人遇到与我类似的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。