آفلاین
user-avatar

ارور Cant set headers after they are sent در nodejs

2 سال پیش
توسط limbo آپدیت شد
آفلاین
user-avatar
limbo ( 146 تجربه )
2 سال پیش

با سلام

من وقتی در کد زیر میخواهم response رو برگردونم ارور Can't set headers after they are sent. رو میده

کد:

    const Controller = require('./../Controller');
    const Project = require('./../../models/Project')

    class RegisterController extends Controller {

        store(req , res , next){

            req.checkBody('project_id','Project ID is invalid').isMongoId();
            req.checkBody('device_model','Device Model Can not be empty.').notEmpty();
            req.checkBody('android_ver','Android version is invalid.').matches("^(*|[۱-۹]+(.[۰-۹]+){۰,۳})$");
            req.checkBody('rooted').isBoolean();
            req.checkBody('device_token','Device Token Can not be empty.').notEmpty();
            req.checkBody('device_os','Device OS is invalid').isIn(['IOS','Andriod']);

            if(this.showValidationErrors(req, res)) {
                return;
            }

            Project.findById(req.body.project_id ,  (err , project)=>{
                if(err) throw err;

                if (!project) {
                    return res.json({error: 'project_id invalid.'});
                 } 
            });

            let token = this.makeid(۳۰);

            let newDevice = new this.model.Device({
                project_id : req.body.project_id,
                device_model : req.body.device_model,
                android_ver : req.body.android_ver,
                rooted : req.body.rooted,
                device_token : req.body.device_token,
                device_os : req.body.device_os,
                api_token : token
            }).save( (err) => {
                if(err) throw err ;
                return res.json({
                    api_token : token,
                    status : config.response.OK
                });
            });
        }

    }

    module.exports = new RegisterController();

متن ارور:

events.js:۱۸۳  
 throw er; // Unhandled 'error' event  
 ^

Error: Can't set headers after they are sent.  
at validateHeader (_http_outgoing.js:۴۹۱:۱۱)  
at ServerResponse.setHeader (_http_outgoing.js:۴۹۸:۳)  
at ServerResponse.header (ode_modulesexpresslib esponse.js:۷۶۷:۱۰)  
at ServerResponse.send (ode_modulesexpresslib esponse.js:۱۷۰:۱۲)  
at ServerResponse.json (ode_modulesexpresslib esponse.js:۲۶۷:۱۵)  
at newDevice.model.Device.save (modulescontrollersapiRegisterController.js:۴۱:۲۴)  
at ode_modulesmongooselibmodel.js:۴۵۰۶:۱۶  
at model.$__save.error (ode_modulesmongooselibmodel.js:۴۰۱:۷)  
at ode_moduleskareemindex.js:۳۱۵:۲۱  
at next (ode_moduleskareemindex.js:۲۰۹:۲۷)  
at ode_moduleskareemindex.js:۱۸۲:۹  
at process.nextTick (ode_moduleskareemindex.js:۴۵۲:۳۸)  
at _combinedTickCallback (internal/process/next_tick.js:۱۳۲:۷)  
at process._tickCallback (internal/process/next_tick.js:۱۸۱:۹)

ارور در وقتی کد زیر رو اضافه کردم وجود اومد:

>     if (!project) {
>     return res.json({error: 'project_id invalid.'});
>     } 
>     });

لطفا راهنمایی کنید
باتشکر

بهترین پاسخ انتخاب شده توسط limbo
آفلاین
user-avatar
حسام موسوی
2 سال پیش

سلام به دلیل اینکه این رویه اجرای کد شما اشتباهه و اشتباهه !
شما مگه یادنگرفتی که داستان Async در جاوااسکریپت به چه معناست ؟
کد شما به این شکل باید باشه

const Controller = require('./../Controller');
const Project = require('./../../models/Project')

class RegisterController extends Controller {

    store(req , res , next){

        req.checkBody('project_id','Project ID is invalid').isMongoId();
        req.checkBody('device_model','Device Model Can not be empty.').notEmpty();
        req.checkBody('android_ver','Android version is invalid.').matches("^(\\*|[1-9]+(\\.[0-9]+){0,3})$");
        req.checkBody('rooted').isBoolean();
        req.checkBody('device_token','Device Token Can not be empty.').notEmpty();
        req.checkBody('device_os','Device OS is invalid').isIn(['IOS','Andriod']);

        if(this.showValidationErrors(req, res)) {
            return;
        }

        Project.findById(req.body.project_id ,  (err , project)=>{
            if(err) throw err;

            if (!project) {
                return res.json({error: 'project_id invalid.'});
             } 

            let token = this.makeid(30);

            let newDevice = new this.model.Device({
                project_id : req.body.project_id,
                device_model : req.body.device_model,
                android_ver : req.body.android_ver,
                rooted : req.body.rooted,
                device_token : req.body.device_token,
                device_os : req.body.device_os,
                api_token : token
            }).save( (err) => {
                if(err) throw err ;
                return res.json({
                    api_token : token,
                    status : config.response.OK
                });
            });
        });

    }

}
آفلاین
user-avatar
حسام موسوی ( 404186 تجربه )
2 سال پیش
تخصص : طراح و برنامه نویس

سلام به دلیل اینکه این رویه اجرای کد شما اشتباهه و اشتباهه !
شما مگه یادنگرفتی که داستان Async در جاوااسکریپت به چه معناست ؟
کد شما به این شکل باید باشه

const Controller = require('./../Controller');
const Project = require('./../../models/Project')

class RegisterController extends Controller {

    store(req , res , next){

        req.checkBody('project_id','Project ID is invalid').isMongoId();
        req.checkBody('device_model','Device Model Can not be empty.').notEmpty();
        req.checkBody('android_ver','Android version is invalid.').matches("^(\\*|[1-9]+(\\.[0-9]+){0,3})$");
        req.checkBody('rooted').isBoolean();
        req.checkBody('device_token','Device Token Can not be empty.').notEmpty();
        req.checkBody('device_os','Device OS is invalid').isIn(['IOS','Andriod']);

        if(this.showValidationErrors(req, res)) {
            return;
        }

        Project.findById(req.body.project_id ,  (err , project)=>{
            if(err) throw err;

            if (!project) {
                return res.json({error: 'project_id invalid.'});
             } 

            let token = this.makeid(30);

            let newDevice = new this.model.Device({
                project_id : req.body.project_id,
                device_model : req.body.device_model,
                android_ver : req.body.android_ver,
                rooted : req.body.rooted,
                device_token : req.body.device_token,
                device_os : req.body.device_os,
                api_token : token
            }).save( (err) => {
                if(err) throw err ;
                return res.json({
                    api_token : token,
                    status : config.response.OK
                });
            });
        });

    }

}
آفلاین
user-avatar
limbo ( 146 تجربه )
2 سال پیش

سلام
ممنون حسام جان @hesammousavi

برای ارسال پاسخ باید وارد سایت شوید