limbo
6 سال پیش توسط limbo مطرح شد
2 پاسخ

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

با سلام

من وقتی در کد زیر میخواهم 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.'});
>     } 
>     });

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


ثبت پرسش جدید
حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 6 سال پیش مطرح شد
1

سلام به دلیل اینکه این رویه اجرای کد شما اشتباهه و اشتباهه !
شما مگه یادنگرفتی که داستان 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
                });
            });
        });

    }

}

limbo
@pesarkhoob68 6 سال پیش آپدیت شد
0

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


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام