You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express项目生成apiDoc后访问路径报unsafe-eval CSP错误如何解决

错误触发原因
  • 你使用的apidoc@0.28.1版本依赖Handlebars模板引擎做前端页面渲染,Handlebars的模板编译逻辑需要调用eval类的动态JS执行能力
  • 你的Express服务配置了Content Security Policy(CSP)安全规则,其中script-src指令仅允许加载同源脚本('self'),明确禁止了unsafe-eval动态执行能力,所以浏览器拦截了Handlebars的执行逻辑,抛出报错。
    大部分情况下这个严格CSP规则是由helmet安全中间件默认开启的,也有可能是你手动在响应头中配置的。
解决方法

可根据你的项目配置选择对应方案:

场景1:项目使用了helmet中间件

方案1:全局调整CSP规则(配置简单)

在helmet配置中新增unsafe-eval到script-src的允许列表:

const helmet = require('helmet');
app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'", "'unsafe-eval'"], // 新增unsafe-eval规则
      // 保留你原有其他CSP配置项即可
    }
  }
}));

方案2:仅对apidoc路由放宽CSP规则(安全性更高,推荐)

不对全局规则做修改,仅在托管apidoc静态资源的路由单独配置宽松CSP:

const express = require('express');
const path = require('path');
const apidocPath = path.join(__dirname, 'api_docs'); // 替换为你的api_docs文件夹实际路径

// 优先配置apidoc路由的特殊CSP规则
app.use('/apidoc', (req, res, next) => {
  res.setHeader(
    'Content-Security-Policy',
    "default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
  );
  next();
}, express.static(apidocPath));

// 其他路由继续使用原来的严格helmet/CSP规则
app.use(helmet());

场景2:手动配置了CSP响应头

找到你设置Content-Security-Policy响应头的代码,在script-src的允许值中添加'unsafe-eval'即可,同样建议仅针对apidoc路由做修改,避免影响其他业务接口的安全性。

场景3:不想修改服务端CSP配置

可以降级apidoc到0.27.x版本,该版本的前端渲染逻辑不依赖unsafe-eval能力,不会触发该报错:

npm uninstall apidoc
npm install apidoc@0.27.1 --save-dev

重新生成api文档后即可正常访问。

内容的提问来源于stack exchange,提问作者Kazi Rahamatullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 05:45:01