Search code examples
typescriptexpressgraphqljwttypeorm

Unable to get refresh token using typeorm with mongodb


I was trying to get the access token by a refresh token. Using Typeorm along with mongoDB. I am passing the id but findone is not getting any user from DB. If I print the Id that is perfect.

Refresh token code:

app.post("/refreshToken", async (req, res) => {
    // Read the incoming cookie
    const token = req.cookies.jid;
    // check if there is no token
    if(!token){ console.log("Case 1"); return res.send({ ok: false, accessToken: "" }) }
    // check if the token is not expired or valid
    let payload: any = null;
    try {
        payload  = verify(token, process.env.REFRESH_TOKEN_SECRET!)
    } catch (error) {
        console.log(error);
        return res.send({ ok: false, accessToken: "" })
    }
    // If token exists, Read the UserID from payload as 
    // we have put userID while creating refresh token
    // console.log("UID : " + payload.userId as ObjectID);
    
    const user = await User.findOne( { where: {"_id": payload.userId} } )
    console.log("USER : " + user);
    // By any chance if there is no user found return no refresh token
    if(!user) { console.log("Case 2"); return res.send({ ok: false, accessToken: "" }) }
    // If there is an User; Return the refresh token
    return res.send({ ok: true, accessToken: createAccessToken(user) });
});

Response is :

USER : undefined
Case 2

Here is the code for refresh and accesstoken

import { sign } from 'jsonwebtoken';
import { User } from './entity/User';

export const createAccessToken = (user: User) => {
      return sign({ userId: user.id }, process.env.ACCESS_TOKEN_SECRET!, {
            expiresIn: "15m"
      })
}

// by adding ! it refers that the type is already defined
export const createRefreshToken = (user: User) => {
      return sign({userId: user.id, }, process.env.REFRESH_TOKEN_SECRET!, {
            expiresIn: "1d"
      })
}

Package.json:

{
   "name": "server",
   "version": "0.0.1",
   "description": "Awesome project developed with TypeORM.",
   "devDependencies": {
      "@types/bcryptjs": "^2.4.2",
      "@types/cookie-parser": "^1.4.2",
      "@types/express": "^4.17.8",
      "@types/graphql": "^14.5.0",
      "@types/jsonwebtoken": "^8.5.0",
      "@types/node": "^14.14.6",
      "nodemon": "^2.0.6",
      "ts-node": "9.0.0",
      "typescript": "4.0.5"
   },
   "dependencies": {
      "apollo-server-express": "^2.19.0",
      "bcryptjs": "^2.4.3",
      "cookie-parser": "^1.4.5",
      "dotenv": "^8.2.0",
      "express": "^4.17.1",
      "graphql": "^15.4.0",
      "jsonwebtoken": "^8.5.1",
      "mongodb": "^3.0.8",
      "reflect-metadata": "^0.1.13",
      "type-graphql": "^1.1.1",
      "typeorm": "0.2.28"
   },
   "scripts": {
      "start": "nodemon --exec ts-node src/index.ts"
   }
}

Solution

  • According to the documentation of typeorm,I guess you used the query criteria incorrectly.
    Try the following:

    const user = await repository.findOne(payload.userId); // find by id
    
    
    //or
    const user = await repository.findOne({"_id": payload.userId});