首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongodb错误:发送到客户端后无法设置头部

Mongodb错误:发送到客户端后无法设置头部
EN

Stack Overflow用户
提问于 2020-04-17 23:01:32
回答 1查看 60关注 0票数 0

我基本上是在创建一个用户注册表单,我在其中检查提交的密码是否匹配,然后通过查询集合查看提交的用户名或电子邮件是否已经存在来检查用户是否已经存在。如果所有数据都通过了检查,那么我将创建一个新用户。我的问题是,如果用户名或电子邮件已经存在,则仍会创建用户。如果发现一个用户,不应该返回一个状态来停止函数吗?

前端提交:

代码语言:javascript
复制
submitNewUser() {
    axios.post('http://localhost:5000/api/settings/users', {
         name: this.newUser.name,
         username: this.newUser.username,
         email: this.newUser.email,
         password: this.newUser.password,
         confirm_password: this.newUser.confirm_password,
         role: this.newUser.role
    })
    .then(() => {
        this.getUsers();
    })
    .catch(error => {
        console.log(error);
    })
}

用户必须登录才能创建新用户,因此我使用passport检查令牌是否包含有效用户

passport验证检查:

代码语言:javascript
复制
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../models/User');
const key = require('./keys').secret;

const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = key;

module.exports = passport => {
    passport.use(
        new JwtStrategy(opts, (jwt_payload, done) =>{
            User.findById(jwt_payload._id).then(user => {
                if (user) return done(null, user);
                return done(null, false);
            }).catch(err => {
                console.log(err);
            });
        })
    );
};

结束路由:

代码语言:javascript
复制
router.post('/users', passport.authenticate('jwt', {
    session: false
}), (req, res) => {
    let companyId = req.user.company_id;

    let {
        name,
        username,
        email,
        password,
        confirm_password,
        role,
    } = req.body;

    //Check that passwords match
    if( password !== confirm_password ) {
        return res.status(400).json({
            msg: "Passwords do not match"
        })
    }

    //Check for unique username 
    User.findOne({ username: username })
        .then(user => {
            console.log('username')
            if(user) {
                return res.status(400).json({
                    msg: "Username is already taken."
                });
            }
        })
        .catch(error => console.log(error));

    //check for unique email
    User.findOne({ email: email })
        .then(user => {
            console.log('email')
            if(user) {
                return res.status(400).json({
                    msg: "Email is already registered. Did you forget your password?"
                });
            }
        })
        .catch(error => console.log(error));

    let newUser = new User({
        name,
        username,
        password,
        email,
        user_role: role,
        company_id: companyId,
    });

    // Hash password
    bcrypt.genSalt(10, (err, salt) => {
        bcrypt.hash(newUser.password, salt, (err, hash) => {
            if(err) throw err;
            newUser.password = hash;
            newUser.save()
                .then(user => {
                    return res.status(201).json({
                        success: true,
                        msg: "User is now registered."
                    });
                })
                .catch(error => console.log(error));
        });
    });
});

这是我在用户已经存在的情况下得到的错误:

代码语言:javascript
复制
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:482:11)
    at ServerResponse.header (C:\Users\Reece\OneDrive\Desktop\Fyber Docs\Valentis-Pipeline-MEVN-App\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (C:\Users\Reece\OneDrive\Desktop\Fyber Docs\Valentis-Pipeline-MEVN-App\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\Reece\OneDrive\Desktop\Fyber Docs\Valentis-Pipeline-MEVN-App\node_modules\express\lib\response.js:267:15)
    at User.findOne.then.user (C:\Users\Reece\OneDrive\Desktop\Fyber Docs\Valentis-Pipeline-MEVN-App\server\routes\api\settings.js:106:40)
    at processTicksAndRejections (internal/process/next_tick.js:81:5)
EN

回答 1

Stack Overflow用户

发布于 2020-04-17 23:57:09

由于异步的本质,在您对mongodb的任何调用成功或失败之前,(req, res) => {就会返回,但是您仍然使用res对象将响应发送回客户端。

我不知道在您正在使用的框架中如何处理这个问题,但是在您开始修改res对象之前,框架似乎会用数据填充res的头部,并将其发送回客户端。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61274693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档