Home > Back-end >  TypeError: generateActiveToken is not a function
TypeError: generateActiveToken is not a function

Time:01-16

I have a problem in Nodejs but I dont't know why this error happening

in config folder I have a file with name generateToken.js and this file have this code:

const jwt = require('jsonwebtoken');

exports.generateActiveToken = async (payload) => {
  return jwt.sign(payload, `${process.env.ACTIVE_TOKEN_SECRET}`, { expiresIn: '5m' })
}

exports.generateAccessToken = (payload) => {
  return jwt.sign(payload, `${process.env.ACCESS_TOKEN_SECRET}`, { expiresIn: '15m' })
}

exports.generateRefreshToken = (payload) => {
  return jwt.sign(payload, `${process.env.REFRESH_TOKEN_SECRET}`, { expiresIn: '30d' })
}

And this error happen in my controller that name is AuthController and this controller I have a function with name register and export that for using in my main file : app.js

this is my RegisterController code:

exports.register = async (req, res) => {
    try {
      const { name, account, password } = req.body;

      const user = await Users.findOne({ account });
      console.log(user);
      
      if (user){
        return res.status(400).json({ msg: "email ya mobile ghablan ozv bod" });
      }

      const passwordHash = await bcrypt.hash(password, 12);

      const newUser = { name, account, password: passwordHash };

      const active_token = generateActiveToken({newUser});

      const url = `${CLIENT_URL}/active/${active_token}`

      if(validateEmail(account)){
        sendMail(account, url, "فعال سازی اکانت")
        return res.json({ msg: "lotfan email khod ra check konid" })
      }

    } catch (err) { 
      // return res.status(500).json({ msg: "be shokhm raft" });

      console.log(err);

    }
  }

in console show this error:

TypeError: generateActiveToken is not a function
    at exports.register (C:\Projects\ProjectName\controllers\authController.js:24:28)

How I can slow this error?

CodePudding user response:

First of all, generateActiveToken is a async function so put an await before function call.

The proper way to export a module is like below:

const jwt = require('jsonwebtoken');

module.exports.generateActiveToken = async (payload) => {
  return jwt.sign(payload, `${process.env.ACTIVE_TOKEN_SECRET}`, { expiresIn: '5m' })
}

module.exports.generateAccessToken = (payload) => {
  return jwt.sign(payload, `${process.env.ACCESS_TOKEN_SECRET}`, { expiresIn: '15m' })
}

module.exports.generateRefreshToken = (payload) => {
  return jwt.sign(payload, `${process.env.REFRESH_TOKEN_SECRET}`, { expiresIn: '30d' })
}

Or:

const jwt = require('jsonwebtoken');

function generateActiveToken = async (payload) => {
  return jwt.sign(payload, `${process.env.ACTIVE_TOKEN_SECRET}`, { expiresIn: '5m' })
}

function generateAccessToken = (payload) => {
  return jwt.sign(payload, `${process.env.ACCESS_TOKEN_SECRET}`, { expiresIn: '15m' })
}

function generateRefreshToken = (payload) => {
  return jwt.sign(payload, `${process.env.REFRESH_TOKEN_SECRET}`, { expiresIn: '30d' })
}

module.exports = {generateActiveToken, generateAccessToken, generateRefreshToken}

Or:

const jwt = require('jsonwebtoken');

module.exports = {
  async generateActiveToken(payload) {
    return jwt.sign(payload, `${process.env.ACTIVE_TOKEN_SECRET}`, { expiresIn: '5m' })
  },

  generateAccessToken(payload) {
    return jwt.sign(payload, `${process.env.ACCESS_TOKEN_SECRET}`, { expiresIn: '15m' })
  },

  generateRefreshToken(payload) {
    return jwt.sign(payload, `${process.env.REFRESH_TOKEN_SECRET}`, { expiresIn: '30d' })
  }
}

And require it like below:

const {generateActiveToken} = require("./your-path-to-file");
  •  Tags:  
  • Related