Typescript Mongoose Error 'not assignable to type 'string''

31 Views Asked by At

I'm trying to create a logout route in my express backend. Basically when a user logs out their JWT token gets saved on a blacklist Mongo database so they can't use the same token to log in again.

The problem is I'm getting a typescript error for my blacklist schema:

Type '{ type: StringConstructor; required: true; }' is not assignable to type 'string'.ts(2322) (property) token: { type: StringConstructor; required: true; }

My blacklist Mongo Schema:

/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-call */
import mongoose, { Schema } from "mongoose";
import { BlacklistMongo } from "../types/blacklist";

const blacklistSchema: Schema<BlacklistMongo> = new mongoose.Schema({
    token: {
        type: String,
        required: true
    },
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User'
    }
}, { timestamps: true });

blacklistSchema.set('toJSON', {
    transform: (_document, returnedObject) => {
        returnedObject.id = returnedObject._id.toString();
        delete returnedObject._id;
        delete returnedObject.__v;
    }
});

export default mongoose.model<BlacklistMongo>('Blacklist', blacklistSchema);

logoutRouter:

import express from 'express';
import middleware from '../utils/middleware';
import { Response } from 'express';
import { BlacklistMongo } from '../types/blacklist';
import blacklist from '../models/blacklist';

const logoutRouter = express.Router();

logoutRouter.post('/', async (request, response, next) => {
    try {
        const token: string | null = middleware.getTokenFrom(request);
        if (!token) {
            throw new Error('Token not found');
        }

        const tokenid: Promise<string | Response> = middleware.tokenValidator(request, response);
        if (tokenid instanceof Response) {
            return tokenid;
        }

        const addedToken: BlacklistMongo = new blacklist({
            token: token
        });

        await addedToken.save();
        response.status(200).json('You have been successfully logged out!');
    } catch (exception) {
        next (exception);
    }
});

export default logoutRouter;
1

There are 1 best solutions below

0
Jo Tang On

Actually I decided to delete the schema and re-write the code again, removing users, and for some reason it worked.

Type:

import { Document } from "mongoose";

export interface BlacklistMongo extends Document {
    token: string;
}

export interface BlacklistType {
    token: string;
}

Blacklist model:

/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable @typescript-eslint/no-unsafe-call */
import mongoose, { Schema } from "mongoose";
import { BlacklistMongo } from "../types/blacklist";

const blacklistSchema: Schema<BlacklistMongo> = new mongoose.Schema({
    token: { type: String, required: true }
});

blacklistSchema.set('toJSON', {
    transform: (_document, returnedObject) => {
      returnedObject.id = returnedObject._id.toString();
      delete returnedObject._id;
      delete returnedObject.__v;
    }
  });

export default mongoose.model<BlacklistMongo>('Blacklist', blacklistSchema);