“编译后无法覆盖用户模型。”使用打字稿,猫鼬和lambda函数

时间:2020-01-28 20:20:45

标签: typescript mongoose lambda

我很确定由于导入和导出猫鼬模式的方式而收到此错误,我已经在Node中完成了此操作,但是尝试将我的代码转换为TypeScript给了我一些麻烦。

初始运行完全正常,我得到了想要的GraphQL游乐场。但是,即使我丝毫修改代码库,标题中也会出现错误。

models \ User.ts

import { Schema, Document, Model, model } from 'mongoose';

export interface IUser extends Document {
    name: string;
    email: string;
    password: string;
}

//Create Schema
const UserSchema: Schema = new Schema({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    }
});

export const User: Model<IUser> = model<IUser>('User', UserSchema);

models \ index.ts


import { User } from "./User";

export default {
    User
};

lambda \ graphql.ts

import { ApolloServer, AuthenticationError } from "apollo-server-lambda";
import "reflect-metadata";
import resolvers from "../resolvers";
import schemas from "../schema";
import * as mongoose from "mongoose";
import { verify } from "jsonwebtoken";
import models from "../models";
import { MONGODB_URI, SECRET } from "../utils/constants";

export interface IToken extends Document {
  name: string;
  email: string;
  password: string;
}

//validate jwt then set me in graphql server context
const getMe = async (token: any) => {

  if (token) {
    try {
      const user = await verify(token, SECRET)
      return user;
    } catch (e) {
      throw new AuthenticationError("Your Session expired. Sign in again.");
    }
  }
  return null;
};


const server = new ApolloServer({
  typeDefs: schemas,
  resolvers,
  context: async ({ event }) => {
    const user = await getMe(event.headers.authorization);
    return {
      models,
      me: user,
      secret: SECRET
    }
  }
});

mongoose
  .connect(MONGODB_URI, { 'useUnifiedTopology': true, 'useNewUrlParser': true })
  .then(() => {
    console.log("mongodb connected");
  })
  .catch(err => {
    console.log(err);
  });

exports.handler = server.createHandler({
  cors: {
    origin: "*",
    credentials: true
  }
});

我怀疑这是我在models \ index.ts中导入的方式吗?我想念什么?

1 个答案:

答案 0 :(得分:0)

这是一个很晚的回复,但这并不是很难解决。在导出语句中,您必须检查现有模型,然后导出该模型或定义的模型。

这是非类型化方式:

export const User = mongoose.models.User || mongoose.model('User', UserSchema);