node.js - 无法从路由调用控制器方法 - Node.js 和 Express.js
问题描述
我有一个AuthenticationController
which has the method signupWithCredentials
。我有另一个控制器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
这是我的控制器类
'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()
。
推荐阅读
- android - Android Studio 组合图表崩溃
- highcharts - 当数据具有 NULL 值时,Highcharts 不会在 Xaxis 上显示年份
- ldap - ldapsearch 过滤字符串字母、大写字母、'.' ,'-','_' 和 '@'
- python - 如何填充在条形图顶部绘制的矩形(Tkinter Python)
- c++ - 具有前向声明类型的函数模板特化
- excel - 活动单元。不针对 Excel VBA 中的活动单元格
- javascript - 如果字符串有多个点,则仅从最后一个点拆分
- amazon-web-services - AWS Lambda SQS 集成:如何强制并发 lambda
- firebase - 加强 Firebase 云功能的同时速率限制
- ibm-midrange - jt400.jar api中如何使用AS400类的connectToPort api