nodejs + express:Cors 不是函数

Posted

技术标签:

【中文标题】nodejs + express:Cors 不是函数【英文标题】:nodejs + express: Cors is not a function 【发布时间】:2018-05-03 14:51:14 【问题描述】:

直到今天早上一直工作正常,突然我收到一个类型错误,指出 Cors is not a function

我的代码

import * as Cors from "cors";
...

const corsOptions: Cors.CorsOptions = 
    allowedHeaders: ["Origin", "X-Requested-With", "Content-Type", "Accept", "X-Access-Token", "Authorization"],
    credentials: true,
    methods: "GET,HEAD,OPTIONS,PUT,PATCH,POST,DELETE",
    origin: "*",
    preflightContinue: true
;

createConnection(ormConfig).then(async connection => 
    // run pending migrations
    await connection.runMigrations();
    // create express server
    const app = express();
    app.use(bodyParser.json(limit: "50mb"));
    app.use(bodyParser.urlencoded(limit: "50mb", extended: true));
    // register cors
    app.use(Cors(corsOptions)); //<---error occurs here
    // register all controllers
    useExpressServer(app, 
        routePrefix: "/api",
        controllers: [
            __dirname + "/controllers/**/*.js,.ts"
        ],
        authorizationChecker: async (action: any, roles: string[]) => 
            return JwtAuthorizationMiddleware.checkIsAuthorized(action, roles);
        ,
        currentUserChecker: async (actions: any) => 
            return JwtAuthorizationMiddleware.extractUserFromJwtToken(actions);
        
    );

    // start the express server
    const port: number = +(process.env.PORT || 44320);
    app.listen(port, (err: Error) => 
        console.log(`App listening on port $port`);
        console.log("Press Ctrl+C to quit.");
    );
).catch(error => console.error("TypeORM connection error: ", error));

cors 和 Node 的当前版本

cors: "^2.8.4"
Node: v8.4.0

最近所做的唯一更改是在星期五我包含以下软件包时

multer: "^1.3.0"
@google-cloud/datastore: "^1.1.0"
@google-cloud/storage: "^1.4.0"

直到今天早上一切正常,在 gcloud 上部署了相同的版本,并且这有效,所以我有点困惑为什么我突然收到这个错误以及可能是什么原因。

非常感谢任何帮助

【问题讨论】:

您是否尝试过类似的方法:app.use(Cors.cors(corsOptions));。怀疑它是否有任何区别,但我假设 cors 可能是许多其他功能的一部分。 我试过了,我什至试过rm -rf node_modules 然后重新安装包并得到同样的错误 【参考方案1】:

你必须有一些东西,例如

const cors = require('cors');

在文件的顶部,然后将模块称为cors,而不是Cors

【讨论】:

【参考方案2】:

您可以阅读 Express 的 cors 文档以了解更多信息。

要将 cors 应用于项目中的所有路由,您可以编写:

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())

【讨论】:

欢迎来到 Stack Overflow!尝试更清楚地解释为什么这是问题的答案。【参考方案3】:

好的,所以我发现问题原来是PEBKAC。

在 gcloud 中实现文件上传和存储时,我必须在 gcloud 上启用 CORS,并将设置文件保存在项目的根目录中,该文件名为 cors.json

在我上面的问题中发布的代码中,导入语句正在读取我的cors.json 文件,而不是(如我所想的)cors NPM 包。

如果其他人犯了我刚刚犯的同样的菜鸟错误,从这个中吸取的教训是要小心你的文件命名和放置位置!!!

【讨论】:

以上是关于nodejs + express:Cors 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

javascript NodeJs + Express中的CORS问题

node跨域cors模块,nodejs+express跨域

本地主机上带有 Angular 的 NodeJS + Express:被 CORS 预检阻止

NodeJS + Express Cors + SocketIO = XMLHttpRequest 错误

如何在 nodejs express 重定向上启用 CORS?

如何为 nodejs Express 服务器启用 CORS?