JavaScript中如何解决标识符重复声明问题?(express-session场景)
解决方法
报错原因很明确:你从express-session导入的session和最后导出的默认函数session重名了,JavaScript同一作用域里不允许重复声明相同标识符。给你两个简单的解决办法:
方案一:修改导出的中间件函数名
把最后那个默认导出的函数名改成别的,比如sessionMiddleware,这样就不会和导入的session冲突了。修改后的代码如下:
import { getMongoClient } from '@/api-lib/mongodb'; import MongoStore from 'connect-mongo'; import session from 'express-session'; import { promisifyStore } from 'next-session/lib/compat'; const mongoStore = MongoStore.create({ clientPromise: getMongoClient(), stringify: false, }); const getSession = session({ secret: process.env.SESSION_SECRET, resave: true, rolling: true, saveUninitialized: false, store: promisifyStore(mongoStore), cookie: { secure: process.env.NODE_ENV == "production" ? false : false , maxAge: 1000 * 60 * 60 * 24 * 7, // 7 days sameSite: 'strict', //expires: new Date(Date.now() + (1000 * 60 * 60 * 24 * 7)),//7 days } }); // 修改函数名为sessionMiddleware,避免重名 export default async function sessionMiddleware(req, res, next) { await getSession(req, res); next(); }
方案二:给导入的express-session加别名
如果你坚持要导出的函数叫session,可以在导入express-session的时候用别名,比如expressSession,然后在创建getSession的时候用这个别名。代码如下:
import { getMongoClient } from '@/api-lib/mongodb'; import MongoStore from 'connect-mongo'; // 导入时使用别名expressSession import { default as expressSession } from 'express-session'; import { promisifyStore } from 'next-session/lib/compat'; const mongoStore = MongoStore.create({ clientPromise: getMongoClient(), stringify: false, }); // 这里用expressSession替代原来的session const getSession = expressSession({ secret: process.env.SESSION_SECRET, resave: true, rolling: true, saveUninitialized: false, store: promisifyStore(mongoStore), cookie: { secure: process.env.NODE_ENV == "production" ? false : false , maxAge: 1000 * 60 * 60 * 24 * 7, // 7 days sameSite: 'strict', //expires: new Date(Date.now() + (1000 * 60 * 60 * 24 * 7)),//7 days } }); export default async function session(req, res, next) { await getSession(req, res); next(); }
两种方案都能解决重复声明的问题,选哪种看你的代码习惯就行。
内容的提问来源于stack exchange,提问作者Kal
相关产品推荐
相关产品推荐

