Typescript 初始化Google Passportjs策略错误
我最近将一个服务器项目从javascript切换到了typescript,并且正在清理一些代码。我曾经把一些google passport Oauth的东西和登录路径保存在不同的文件中,但我决定将它们合并起来。在这个过程中,我破坏了一些代码,不明白为什么会发生错误或者如何修复它。提前谢谢 我知道错误发生在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):
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似乎是未定义的
。很抱歉回复太晚,谢谢你的帮助,马特。思维棒极了马特。