当前位置: 首页 > 知识库问答 >
问题:

Node.js发送到客户端后无法设置标头

梁兴文
2023-03-14

我正在关注一个关于udemy上的节点.js的课程,这有点过时了,遇到了这些错误,我无法找到解决方案。

我尝试了什么:

  • 使用next();
  • 在所有if语句中添加返回res

有人能帮我修一下这些吗?我将不胜感激!

提前感谢!

用户名存在错误:错误 [ERR_HTTP_HEADERS_SENT]:在服务器响应.set 上将标头发送到客户端后无法设置标头 (_http_outgoing.js:526:11) 在 ServerResponse.标头 (C:\用户\文档\项目\聊天应用\聊天应用\聊天应用\后端\node_modules\express\lib\响应.js:771:10) 在 ServerResponse.send (C:\用户\文档\项目\聊天应用\聊天应用\后端\node_modules\express\lib\响应.js:170:12)
at ServerResponse.json (C:\用户\文档\项目\聊天应用\聊天应用后端\node_modules\快速\lib\响应.js:267:15)
在 C:\用户\文档\项目\聊天应用\聊天应用后端\控制器\auth.js:38:56 at 进程ticksandReections (内部/进程/task_queues.js:97:5) { 代码: 'ERR_HTTP_HEADERS_SENT' }

module.exports = {
    CreateUser(req, res) {

        const schema = Joi.object().keys({
            username: Joi.string().min(5).max(15).required(),
            email: Joi.string().email().required(),
            password: Joi.string().min(5).required()
        });

        const {error, value} = Joi.validate(req.body, schema);

        if (error && error.details) {
            return res.status(HttpStatus.BAD_REQUEST).json({message: error.details});
        } 

        async function EmailExists() {
            return await User.findOne({email: Helpers.lowerCase(req.body.email)}) != undefined;
        }

        async function UsernameExists() {
            return await User.findOne({username: Helpers.firstLetterUppercase(req.body.username)});
        }

        EmailExists().then(exists => {
            if (exists) {
                return res.status(HttpStatus.CONFLICT).json({message: 'Email already exists'});
            }
        }).catch((err) => console.log('Email exists error: ', err));

        UsernameExists().then(exists => {
            if (exists) {
                return res.status(HttpStatus.CONFLICT).json({message: 'Username already exists'}) != undefined;
            }
        }).catch((err) => console.log('Username exists error: ', err));


        return BCrypt.hash(value.password, 10, (error, hash) => {
            if (error) {
                return res.status(HttpStatus.BAD_REQUEST).json({message: 'Error hashing password'});
            }

            const body = {
                username: Helpers.firstLetterUppercase(value.username),
                email: Helpers.lowerCase(value.email),
                password: hash
            };

            User.create(body).then((user) => {
                res.status(HttpStatus.CREATED).json({message: 'User created successfully'});
            }).catch((err) => {
                res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({message: 'Something went wrong. Could not save user'});
            });
        });
    }
}

共有1个答案

宋昕
2023-03-14

你正在执行一些promise,并且在执行下一个代码之前不要等待答案。

有许多方法可以处理这个问题,下面的代码只是一种方法...

    const hash = () => BCrypt.hash(value.password, 10, (error, hash) => {
        if (error) {
            return res.status(HttpStatus.BAD_REQUEST).json({message: 'Error hashing password'});
        }

        const body = {
            username: Helpers.firstLetterUppercase(value.username),
            email: Helpers.lowerCase(value.email),
            password: hash
        };

        User.create(body).then((user) => {
            res.status(HttpStatus.CREATED).json({message: 'User created successfully'});
        }).catch((err) => {
            res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({message: 'Something went wrong. Could not save user'});
        });
    });


    EmailExists().then(exists => {
        if (exists) {
            return res.status(HttpStatus.CONFLICT).json({message: 'Email already exists'});
        }

           UsernameExists().then(exists => {
                if (exists) {
                   return res.status(HttpStatus.CONFLICT).json({message: 'Username already exists'}) != undefined;
                }

                return hash();
           }).catch((err) => console.log('Username exists error: ', err));          


    }).catch((err) => console.log('Email exists error: ', err));
 类似资料:
  • 问题内容: 将标头发送到客户端后,无法设置标头。这是请求验证后的后端错误,看起来像标头问题。我为我的项目脏代码感到抱歉,我还需要做其他事情,因此在注释中有一些代码。这是我的代码 您可以在我的代码中发现其他错误,因为我尝试了许多不同的方法。这是passport.js配置文件 这是身份验证的ajax请求 非常感谢你。 问题答案: 这是由于您的代码试图从authenticate函数发送多个响应。 删除其

  • 将标头发送到客户端后,无法对其进行设置。这是我的身份验证post请求后的后端错误。看起来标题有问题。我很抱歉我的项目肮脏的代码,我需要做一些别的事情,所以有一些代码在评论中。这是我的代码 你可以在我的代码中找到其他错误,因为我尝试了许多不同的方法。以下是passport.js配置文件 这是用于身份验证的 ajax 请求 非常感谢。

  • 我在NodeJS中使用Passport.js、Express和Mongoose时遇到了这个奇怪的问题。基本上,即使我只发送了一个头,我还是得到一个错误,说“不能在头被发送到客户端后设置它们”。 我读过其他帖子并尝试过,但没有一个有效。 应用程序。get-res.send与return res.send之间有什么区别吗 错误[ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后,无法设

  • 问题内容: 我对Node.js相当陌生,遇到了一些问题。 我正在使用Node.js 4.10和Express 2.4.3。 当我尝试访问http://127.0.0.1:8888/auth/facebook时,我将重定向到http://127.0.0.1:8888/auth/facebook_callback。 然后,我收到以下错误: 以下是我的代码: 我可以知道我的代码有什么问题吗? 问题答案:

  • 问题内容: 我对Node.js相当陌生,遇到了一些问题。 我正在使用Node.js 4.10和Express 2.4.3。 当我尝试访问http://127.0.0.1:8888/auth/facebook时,我将重定向至http://127.0.0.1:8888/auth/facebook_callback。 然后,我收到以下错误: 以下是我的代码: 我可以知道我的代码有什么问题吗? 问题答案:

  • 所以我看到了一篇很棒的帖子“错误:发送到客户端后无法设置标题,但仍然不明白我的“标题”部分有什么问题,因为当我将它从注释掉的