Search code examples
expressauthenticationjwtexpress-jwtstateless-session

stateless session api request


I am building a simple app that uses JWT for authentication. But I keeps on getting the error saying the route I GET to require a call back function.

What do I expect?

I should be getting the current user's data back.

What do I actually get?

Error: Route.get() requires a callback function but got a [object Object]

Route:

const authenticate = require("../middlewares/authenticate");
const usersController = require("../controllers").users;

app.get("/users/me", authenticate, usersController.getMe);

Model:

"use strict";
const jwt = require("jsonwebtoken");

module.exports = (sequelize, DataTypes) => {
  var User = sequelize.define(
    "User",
    {
      email: DataTypes.STRING,
      password: DataTypes.STRING
    },
    {
      classMethods: {
        associate: function(models) {
          // associations can be defined here
        },
        findByToken: function(token) {
          const User = this;
          let decoded;

          try {
            decoded = jwt.verify(token, "leogoesger");
          } catch (e) {
            console.log(e);
          }

          return User.find({ where: { email: decoded.email } });
        }
      }
    }
  );
  return User;
};

Middleware:

const { User } = require("../models/user");

const authenticate = (req, res, next) => {
  console.log("called here");
  const token = req.header("x-auth");
  User.findByToken(token)
    .then(user => {
      if (!user) {
      }

      req.user = user;
      req.token = token;
      next();
    })
    .catch(e => {
      res.status(401).send(e);
    });
};

module.exports = { authenticate };

Controller:

module.exports = {
  getMe(req, res) {
    res.status(200).send({ message: "hello" });
  }
};

Solution

  • Your authenticate module exports an object, yet you do this:

    const authenticate = require("../middlewares/authenticate");
    

    which means your const authenticate is an object, not your function. Change that to this:

    const authenticate = require("../middlewares/authenticate").authenticate;
    

    Or, change the module to export the function directly instead of exporting an object with the function in it.