最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

无法从route

IT培训 admin 1浏览 0评论

无法从route

我有一个AuthenticationControllersignupWithCredentials的方法。我有另一个名为TestController的控制器,虽然可以正常工作。

在制作route时,我收到此错误:

router.post('/user/signup',
AuthenticationController.signupWithCredentials)

这些是我的路线:

'use strict'

const { Router } = require('express')
const { TestController } = require('./../controllers/TestController')
const { AuthenticationController } = require('./../controllers/AuthenticationController')
const { AuthMiddleware } = require('./../middleware/AuthMiddleware')

const router = new Router()

router.get('/test', TestController.test)

router.post('/user/signup', AuthenticationController.signupWithCredentials)

module.exports = router

这是我的Controller类

'use strict'
const uuid = require('uuid/v4')
const bcrypt = require('bcrypt')
const config = require('./../config')

const { promiseEjs } = require('./../utils/promiseEjs')
const { mailSender } = require('./../utils/mailSender')
const { errorHandler } = require('./../utils/errorHandler')
const { User } = require('./../schema/user')
const { authMiddleWare } = require('./../middleware/AuthMiddleware')

class AuthenticationController {
    /**
     * API 1.0 | POST
     * @example {
        *      firstName: String,
        *      lastName: String,
        *      email: String,
        *      password: String
        *       }
        * @param {*} req
        * @param {*} res
        */
    static async signupWithCredentials (req, res) {
        try {
            let email = req.body.email
            let user = await User.findOne({ email: email })
            if (user) {
                throw {
                    code: 400, message: 'User already exist'
                }
            }
            else {
                let emailVerificationToken = uuid()
                user = new User({
                    firstName: req.body.firstName,
                    lastName: req.body.lastName,
                    email: req.body.email,
                    password: bcrypt.hashSync(req.body.password, 8),
                    emailVerificationToken: emailVerificationToken
                })
                await user.save()
                try {
                    let emailVerificationLink = `${config.SERVER_DEV_URL}/authentication/verify?token=${emailVerificationToken}&user=${user._id}`
                    if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'staging') { emailVerificationLink = `${config.SERVER_PRODUCTION_URL}/authentication/verify?token=${emailVerificationToken}&user=${user._id}` }
                    let html = await promiseEjs.renderFile('./emails/signup.ejs', { user: user, emailVerificationLink: emailVerificationLink })
                    await mailSender.sendMail(user.email, 'Welcome to HandyGems', html)
                }
                catch (error) {
                    console.log(error)
                }
                let authToken = authMiddleWare.createJWT(user)
                await User.findOneAndUpdate({ _id: user._id }, { $set: { authToken: authToken } })
                res.send({ authToken: authToken })
            }
        }
        catch (error) {
            errorHandler.sendError(res, error)
        }
    }
}

const authenticationController = new AuthenticationController()
module.exports = { authenticationController }
回答如下:

导出你的类而不是制作它的对象

class AuthenticationController {
    static async signupWithCredentials (req, res) {
        console.log('you are just calling static method')
    }
    withoutStaticMethod(req, res) {
        console.log('you are just calling non static method using object')
    }
}
module.exports = AuthenticationController

如果你有静态方法,请不要使用类名,如路由文件中的下面代码那样直接调用它

const AuthenticationController  = require('./AuthenticationController')
router.get('/signup', AuthenticationController.signupWithCredentials) 

如果你想调用非静态方法,如withoutStaticMethod那么你必须使类的对象获得类的功能

const obj  = new AuthenticationController()
router.get('/testing2', obj.withoutStaticMethod)

静态方法调用直接在类上进行,并且在类的实例上不可调用。静态方法通常用于创建实用程序功能。

您需要使用类名称来调用它们:CLASSNAME.STATIC_METHOD_NAME()或通过将方法作为构造函数的属性来调用:this.constructor.STATIC_METHOD_NAME()

无法从route

我有一个AuthenticationControllersignupWithCredentials的方法。我有另一个名为TestController的控制器,虽然可以正常工作。

在制作route时,我收到此错误:

router.post('/user/signup',
AuthenticationController.signupWithCredentials)

这些是我的路线:

'use strict'

const { Router } = require('express')
const { TestController } = require('./../controllers/TestController')
const { AuthenticationController } = require('./../controllers/AuthenticationController')
const { AuthMiddleware } = require('./../middleware/AuthMiddleware')

const router = new Router()

router.get('/test', TestController.test)

router.post('/user/signup', AuthenticationController.signupWithCredentials)

module.exports = router

这是我的Controller类

'use strict'
const uuid = require('uuid/v4')
const bcrypt = require('bcrypt')
const config = require('./../config')

const { promiseEjs } = require('./../utils/promiseEjs')
const { mailSender } = require('./../utils/mailSender')
const { errorHandler } = require('./../utils/errorHandler')
const { User } = require('./../schema/user')
const { authMiddleWare } = require('./../middleware/AuthMiddleware')

class AuthenticationController {
    /**
     * API 1.0 | POST
     * @example {
        *      firstName: String,
        *      lastName: String,
        *      email: String,
        *      password: String
        *       }
        * @param {*} req
        * @param {*} res
        */
    static async signupWithCredentials (req, res) {
        try {
            let email = req.body.email
            let user = await User.findOne({ email: email })
            if (user) {
                throw {
                    code: 400, message: 'User already exist'
                }
            }
            else {
                let emailVerificationToken = uuid()
                user = new User({
                    firstName: req.body.firstName,
                    lastName: req.body.lastName,
                    email: req.body.email,
                    password: bcrypt.hashSync(req.body.password, 8),
                    emailVerificationToken: emailVerificationToken
                })
                await user.save()
                try {
                    let emailVerificationLink = `${config.SERVER_DEV_URL}/authentication/verify?token=${emailVerificationToken}&user=${user._id}`
                    if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'staging') { emailVerificationLink = `${config.SERVER_PRODUCTION_URL}/authentication/verify?token=${emailVerificationToken}&user=${user._id}` }
                    let html = await promiseEjs.renderFile('./emails/signup.ejs', { user: user, emailVerificationLink: emailVerificationLink })
                    await mailSender.sendMail(user.email, 'Welcome to HandyGems', html)
                }
                catch (error) {
                    console.log(error)
                }
                let authToken = authMiddleWare.createJWT(user)
                await User.findOneAndUpdate({ _id: user._id }, { $set: { authToken: authToken } })
                res.send({ authToken: authToken })
            }
        }
        catch (error) {
            errorHandler.sendError(res, error)
        }
    }
}

const authenticationController = new AuthenticationController()
module.exports = { authenticationController }
回答如下:

导出你的类而不是制作它的对象

class AuthenticationController {
    static async signupWithCredentials (req, res) {
        console.log('you are just calling static method')
    }
    withoutStaticMethod(req, res) {
        console.log('you are just calling non static method using object')
    }
}
module.exports = AuthenticationController

如果你有静态方法,请不要使用类名,如路由文件中的下面代码那样直接调用它

const AuthenticationController  = require('./AuthenticationController')
router.get('/signup', AuthenticationController.signupWithCredentials) 

如果你想调用非静态方法,如withoutStaticMethod那么你必须使类的对象获得类的功能

const obj  = new AuthenticationController()
router.get('/testing2', obj.withoutStaticMethod)

静态方法调用直接在类上进行,并且在类的实例上不可调用。静态方法通常用于创建实用程序功能。

您需要使用类名称来调用它们:CLASSNAME.STATIC_METHOD_NAME()或通过将方法作为构造函数的属性来调用:this.constructor.STATIC_METHOD_NAME()

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论