Typescript 初始化Google Passportjs策略错误

Typescript 初始化Google Passportjs策略错误,typescript,express,passport.js,Typescript,Express,Passport.js,我最近将一个服务器项目从javascript切换到了typescript,并且正在清理一些代码。我曾经把一些google passport Oauth的东西和登录路径保存在不同的文件中,但我决定将它们合并起来。在这个过程中,我破坏了一些代码,不明白为什么会发生错误或者如何修复它。提前谢谢 我知道错误发生在server.express.use(auth.initialize())行的index.ts中。我收到错误未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):

我最近将一个服务器项目从javascript切换到了typescript,并且正在清理一些代码。我曾经把一些google passport Oauth的东西和登录路径保存在不同的文件中,但我决定将它们合并起来。在这个过程中,我破坏了一些代码,不明白为什么会发生错误或者如何修复它。提前谢谢

我知道错误发生在
server.express.use(auth.initialize())
行的index.ts中。我收到错误
未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):TypeError:无法读取未定义的属性“initialize”
您能帮我找出我做错了什么吗

index.ts

import { createTypeormConn } from './db/createConn'
import schema from './graphql'
import { pubsub } from './graphql/PubSub'
import * as auth from './middleware/auth'
const express = require('express')
const { GraphQLServer, PubSub } = require('graphql-yoga')
const cookieSession = require('cookie-session')
const cors = require('cors')
const path = require('path')

export const startServer = async () => {
    await createTypeormConn()
    const corsOptions = {
        origin: [
            //omitted for brevity
        ],
        credentials: true
    }

    const options = {
        port: process.env.PORT || 1337,
        endpoint: '/api',
        subscriptions: '/api',
        playground: '/playground'
    }

    const server = new GraphQLServer({
        schema,
        context: req => ({ pubsub, request: req.request })
    })

    server.express.use(
        cookieSession({
            maxAge: 24 * 60 * 60 * 1000,
            keys: [''] //omitted
        })
    )

    server.use(cors(corsOptions))
    server.express.options('/api', cors(corsOptions))
    server.express.use(auth.initialize()) //fails during initialize
    server.express.use(auth.session())
    server.express.use('/auth', auth.routes)
    server.express.use('/', express.static(path.join(__dirname, 'site')))
    server.start(options, ({ port }) => {
        console.log(`Server is running on localhost:${port}`)
    })
}
startServer()
import { User } from '../db/orm'
import * as passport from 'passport'
import { Router } from 'express'
import { OAuth2Strategy } from 'passport-google-oauth'

passport.serializeUser<any, any>((user, done) => {
    done(null, user.id)
})

passport.deserializeUser((id, done) => {
    User.findOne(id).then(user => {
        done(null, user)
    })
})

passport.use(
    new OAuth2Strategy(
        {
            callbackURL: '/auth/google/redirect',
            clientID:'', //omitted
            clientSecret: '' //omitted
        },
        async (accessToken, refreshToken, profile, done) => {
            //omitted
            return done(null, user)
        }
    )
)

const routes = Router()

routes.get('/google/start', (req, res) => {
    passport.authenticate('google', {
        scope: ['profile'],
        state: req.query.stream
    } as any)(req, res)
})

routes.get('/google/redirect', passport.authenticate('google'), (req, res) => {
    //omitted    
})

const initialize = passport.initialize
const session = passport.session
export { initialize, session, routes }
auth.ts

import { createTypeormConn } from './db/createConn'
import schema from './graphql'
import { pubsub } from './graphql/PubSub'
import * as auth from './middleware/auth'
const express = require('express')
const { GraphQLServer, PubSub } = require('graphql-yoga')
const cookieSession = require('cookie-session')
const cors = require('cors')
const path = require('path')

export const startServer = async () => {
    await createTypeormConn()
    const corsOptions = {
        origin: [
            //omitted for brevity
        ],
        credentials: true
    }

    const options = {
        port: process.env.PORT || 1337,
        endpoint: '/api',
        subscriptions: '/api',
        playground: '/playground'
    }

    const server = new GraphQLServer({
        schema,
        context: req => ({ pubsub, request: req.request })
    })

    server.express.use(
        cookieSession({
            maxAge: 24 * 60 * 60 * 1000,
            keys: [''] //omitted
        })
    )

    server.use(cors(corsOptions))
    server.express.options('/api', cors(corsOptions))
    server.express.use(auth.initialize()) //fails during initialize
    server.express.use(auth.session())
    server.express.use('/auth', auth.routes)
    server.express.use('/', express.static(path.join(__dirname, 'site')))
    server.start(options, ({ port }) => {
        console.log(`Server is running on localhost:${port}`)
    })
}
startServer()
import { User } from '../db/orm'
import * as passport from 'passport'
import { Router } from 'express'
import { OAuth2Strategy } from 'passport-google-oauth'

passport.serializeUser<any, any>((user, done) => {
    done(null, user.id)
})

passport.deserializeUser((id, done) => {
    User.findOne(id).then(user => {
        done(null, user)
    })
})

passport.use(
    new OAuth2Strategy(
        {
            callbackURL: '/auth/google/redirect',
            clientID:'', //omitted
            clientSecret: '' //omitted
        },
        async (accessToken, refreshToken, profile, done) => {
            //omitted
            return done(null, user)
        }
    )
)

const routes = Router()

routes.get('/google/start', (req, res) => {
    passport.authenticate('google', {
        scope: ['profile'],
        state: req.query.stream
    } as any)(req, res)
})

routes.get('/google/redirect', passport.authenticate('google'), (req, res) => {
    //omitted    
})

const initialize = passport.initialize
const session = passport.session
export { initialize, session, routes }
从“../db/orm”导入{User}
从“passport”导入*作为passport
从“express”导入{Router}
从“passport google oauth”导入{OAuth2Strategy}
passport.user((用户,完成)=>{
完成(空,user.id)
})
passport.deserializeUser((id,done)=>{
User.findOne(id).then(User=>{
完成(空,用户)
})
})
passport.use(
新OAuth2策略(
{
回调URL:“/auth/google/redirect”,
clientID:“”,//省略
clientSecret://省略
},
异步(accessToken、refreshToken、profile、done)=>{
//省略
返回完成(空,用户)
}
)
)
常数路由=路由器()
routes.get('/google/start',(req,res)=>{
passport.authenticate('google'{
范围:['profile'],
状态:req.query.stream
}(如有)(要求、回复)
})
routes.get('/google/redirect',passport.authenticate('google'),(req,res)=>{
//省略
})
const initialize=passport.initialize
const session=passport.session
导出{初始化,会话,路由}

您正在丢失
护照的
上下文。替换:

const initialize = passport.initialize
const session = passport.session
与:


要获得更多信息,请在
startServer
定义上方添加
console.log(auth)
,然后在抛出错误的行之前再次添加。@MattMcCutchen两个控制台日志产生相同的结果。控制台打印一个对象:
{routes:{//brevity},initialize:[Function],session:[Function]
@MattMcCutchen另外,如果我使用VSCode调试器进入initialize方法,最后一行包含
返回此值。\ u framework.initialize(此,选项)
而且_framework似乎是
未定义的
。很抱歉回复太晚,谢谢你的帮助,马特。思维棒极了马特。