NodeJS cors包发送状态而不是错误

2admgd59  于 2023-03-17  发布在  Node.js
关注(0)|答案(3)|浏览(145)

我正在尝试使用nodeexpress环境中的cors包来验证请求域是否可以访问我的资源。按照官方文档,这部分不是问题。但问题是响应。如果不允许域访问-cors将发送带有堆栈跟踪的错误(文件路径)。可以避免这种情况,只用状态401响应,类似res.status(401).end()吗?我试过了,但它给了我错误,因为头已经发送了。

const cors = require("cors");

const corsOptions = async (req, callback) => {
    let domain = getDomain(req);
    if (domain === false) {
        return callback(new Error("Not allowed by CORS"));
    }

    const isWhitelisted = await client.get(domain).catch(err => { console.log(err); });

    if (isWhitelisted !== undefined) {
        callback(null, true);
    } else {
        callback(new Error("Not allowed by CORS"));
    }
};

app.use(cors(corsOptions));

因此,我希望将callback(new Error("Not allowed by CORS"));这一部分替换为仅发送状态401和结束流,以便在客户端中不打印堆栈错误。

3hvapo4f

3hvapo4f1#

根据源代码,您在callback中发送的内容是无法完成的,因为err是在next函数中传递的,如

if(err) next(err);

但有一个简单的变通办法,你想要什么。
cors()返回了一个中间件(一个有req,res和next三个参数的函数),所以你可以把cors封装在中间件中,然后返回你想要的任何东西,如果一切都很完美,你可以使用cors

const app = require('express')();
const cors = require("cors");

const corsMid = (req, res, next)=>{
        const trueVal = true;
        if(trueVal){
            res.status(400).send("Error")
        }else{
            return cors()(req,res,next);
        }
}
app.use(corsMid);

app.get('/', (req, res)=>{
    res.json('Hello World');
})

app.listen(8080, ()=>{
    console.log('started')
})
kq4fsx7k

kq4fsx7k2#

我发现一个解决方法是,您可以先在变量上构造Error,然后从error变量中删除stack属性:

let err = new Error('Not allowed by CORS')
err.stack = ""
callback(err)

希望这能有所帮助!

eufgjt7s

eufgjt7s3#

你可以做这样的事

import cors from 'cors';

export const devCorsOptions: cors.CorsOptionsDelegate = (req: any, callback: any) => {
    const ipAddress = req.socket.remoteAddress;
    if (ipAddress === '<WHITELISTED_IP>') callback(null, true);
    else callback(req.res.status(403).json({ message: 'Forbidden!' }), false);
};

这将返回一个JSON响应但主要是一个403状态代码。

相关问题