96SEO 2026-06-13 05:12 3
咱就是说Zui近在搞一个项目,需要用 JWT 来保护后端接口。之前在论坛项目里JWT 用的dou是 `localStorage`,感觉挺简单的。但咱换到了 Express + TypeScript,感觉一下子就多了不少麻烦。哈哈,一开始还觉得 TypeScript 这玩意儿挺好玩的,Neng让代码geng规范、geng健壮。结果呢?你懂的。

说到 SEO,那可就跟百度有没有收录这回事儿扯上关系了。有些人说“为什么百度不收录”,那其实原因挺多的。比如你的网站内容质量不高、关键词不精准、网站结构混乱等等。其实咱的项目也挺不错的,内容也比较丰富。不过呢,有时候就是感觉百度不太喜欢咱这个项目。
不过别担心,这玩意儿咱Ke以慢慢来优化。
第一个坑:类型定义的问题我
遇到的问题就是类型定义的问题。我直接在 `req` 上挂了一个 `user` 属性:req.user = user; 在 JS 版本里hen简单,一句话搞定。但是到了 TS 里呢?编译器直接报错:类型“Request”上不存在属性“user” 。 你懂的?你给它告诉它这个属性存在了但是它还是不相信。
export const authMiddleware = async => { try { const authHeader = req.headers.authorization; if ) { return res.status.json; } const token = authHeader.split; const decoded = jwt.verify as { userId: string }; const user = await User.findById.select; if return res.status.json; req.user = user; // 这里是关键! next; } catch { // 处理 Token 过期、无效等情况 }};
Express 的类型定义里啊,Request 对象并没有 `user` 属性。我当时就想:“不对不对!应该是有的!” 我需要告诉 TypeScript:“我的 `req` 上会多一个 `user` 对象”。 这时候啊,我才意识到 TypeScript 的“严格”确实是挺吓人的。
export interface AuthRequest extends Request { user?: any;}
我显式声明了 `req: AuthRequest` 在路由里使用的时候 ,TypeScript 就安静下来了。优雅败给了现实啊!但代码跑通了。
第二、三坑: 接口和编译时警告我 尝试了Zui“优雅”的Zuo法——创建一个 `src/types/express.d.ts` 文件,用 `declare global` 来 `Express.Request` 。谁知不管怎么配啊 ,编译时dou找不到那个属性 。后来发现 ,只要 `.d.ts` 文件里包含 `import` 语句 ,TypeScript 就把它当成普通模块 ,全局 失效了。
export interface AuthRequest extends Request { user?: any;}
折腾了一下午 ,我选择了Zui务实的方法:直接在中间件文件 `auth.ts` 里定义一个 接口 `AuthRequest extends Request` ,并导出它 。在路由文件里导入并使用:
import { AuthRequest } from './types/express'; // 注意导入路径下面是Zui终Neng正常工作的 `authMiddleware` 。它从 `authHeader` 中提取 token ,用 `jwt.verify` 解析 ,查数据库 ,挂载用户 ,Zui后调用 `next` 。Ru果 token 无效或过期 ,会返回不同的错误信息。
export const authMiddleware = async => { try { const authHeader = req.headers; if ) { return res.status.json; } const token = authHeader?.split; // 使用可选链防止 解决方案是加非空断言!req.user!._id。这行代码的意思是:“我确定这个值在这里一定不是null或undefined,你不用检查了”。 它不是偷懒 ,而是一种与编译器的“约定”:中间件保证了这个值存在 ,请放心。
第三个坑:警告信息
后 ,TS 不再报错“属性不存在” ,但它在使用 `req.user._id` 时依旧会警告:“对象可Neng为‘未定义’”。因为用户被我定义成了可选属性,而 TypeScript 不知道中间件Yi经在运行时给它赋了值。
其实这个问题也挺常见的 。有时候我们为了代码的简洁性或者方便性 ,会把某些变量定义成可选的 。但是要记住的是 ,TypeScript 会在编译的时候对这些变量进行检查 。Ru果我们在运行时没有给这些变量赋值或者没有进行适当的校验 ,那么就会出现警告信息 或者错误信息 。
写在Zui后
TypeScript 给后端开发带来的“严格”,刚开始时确实会拖慢节奏。但当你习惯了先定义类型 、再实现逻辑的流程后 ,会发现hen多运行时的错误在编译阶段就被消灭了。这次踩坑经历让我geng清楚地认识到 :在 JS 里靠经验避免的错误 ,在 TS 里Ke以靠编译器帮你记住。
Token 的存储位置
Token 的存储位置一直是个争议点 。放在localStorage里 ,有被 XSS攻击窃取的风险;放在httpOnly cookie里geng安全 ,但需要后端配合设置 ,实现成本高 。
一些小贴士
使用合适的库来处理 JWT 。
确保你的 JWT Secret 安全存储起来 。
考虑使用 HTTPS 来保护你的 API 通信。
定期轮换 JWT Secret 以防止安全漏洞被利用.。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback