Запрос mongodb внутри запроса

Я новичок в mongoDB, Nodejs, и я буду благодарен за вашу помощь.

В приведенном ниже коде я пытаюсь найти и получить оставшееся количество из модели коллекции «excConfigModel», передав код экзамена, и есть проверка оставшегося количества, если оно больше 0, а затем найти другую модель коллекции «excRegisterModel» на основе кода экзамена и то есть проверка, чтобы избежать дублирования записи в БД. Если он уникален, то сохраните документ, иначе верните сообщение об ошибке «сообщение:« Уже зарегистрировано »». Но после запуска кода сохранение работает нормально, но я получаю ошибку ниже, и сервер узла останавливается.

Пожалуйста, помогите мне, как я могу справиться с несколькими запросами в запросе.


Error: Can't set headers after they are sent. at validateHeader (_http_outgoing.js:491:11) at ServerResponse.setHeader (_http_outgoing.js:498:3) at ServerResponse.header (C:\practice\angular2\student-reg-app\node_modules\express\lib\response.js:767:10) at ServerResponse.send (C:\practice\angular2\student-reg-app\node_modules\express\lib\response.js:170:12) at ServerResponse.json (C:\practice\angular2\student-reg-app\node_modules\express\lib\response.js:267:15) at C:\practice\angular2\student-reg-app\server\routes\api.js:208:17 at C:\practice\angular2\student-reg-app\node_modules\mongoose\lib\model.js:4495:16 at model.$__save.error (C:\practice\angular2\student-reg-app\node_modules\mongoose\lib\model.js:396:7) at C:\practice\angular2\student-reg-app\node_modules\kareem\index.js:315:21 at next (C:\practice\angular2\student-reg-app\node_modules\kareem\index.js:209:27) at Kareem.execPost (C:\practice\angular2\student-reg-app\node_modules\kareem\index.js:217:3) at _cb (C:\practice\angular2\student-reg-app\node_modules\kareem\index.js:307:15) at $__handleSave (C:\practice\angular2\student-reg-app\node_modules\mongoose\lib\model.js:310:5) at C:\practice\angular2\student-reg-app\node_modules\mongoose\lib\model.js:193:7 at result (C:\practice\angular2\student-reg-app\node_modules\mongodb\lib\utils.js:414:17) at session.endSession (C:\practice\angular2\student-reg-app\node_modules\mongodb\lib\utils.js:401:11)

Ниже приведен код, пожалуйста, помогите мне, если не ясно с моим вопросом, пожалуйста, дайте мне знать, я предоставлю более подробную информацию.

    const express = require('express');
    const router = express.Router();
    const mongoose = require('mongoose');
    const usersSchemaModel = require('../models/users-schema');
    const statesSchemaModel = require('../models/states-schema');
    const citiesSchemaModel = require('../models/cities-schema');
    const examSchemaModel = require('../models/exam-schema');
    const examConfigModel = require('../models/exam-config-schema');
    const examRegisterModel = require('../models/regrequests-schema');
    const db = require('../config/db');
    const bcrypt = require('bcryptjs');
    const passport = require('passport');
    const LocalStrategy = require('passport-local').Strategy;
    var jwt = require('jsonwebtoken');

    mongoose.Promise = global.Promise;
    mongoose.connect(db.database,(err)=>{
        if(err){
            res.json(err);
        }else{
            console.log('connected');
        }
    });

    //Register exam
    router.post('/exam/register',(req, res)=>{
        examConfigModel.findOne({
            examcode: req.body.exam
          },function(err, result) {
            if (err) {
                throw err;
            } else {
                console.log("Rem Seats: " + result.remaining);
                if(result.remaining > 0){
                    console.log("remaining: "+result.remaining);
                    const examModel = new examRegisterModel();
                    examModel.userid = req.body.userid;
                    examModel.stateid = req.body.stateid;
                    examModel.cityid = req.body.cityid;
                    examModel.exam_code = req.body.exam;
                    examModel.father_name = req.body.father_name;
                    examModel.last_name = req.body.last_name;
                    examModel.mobileno = req.body.mobileno;
                    examModel.city = req.body.city;
                    examModel.street = req.body.street;
                    examModel.address = req.body.address;
                    examModel.zipcode = req.body.zipcode;
                    console.log("RequestBody: "+req.body.exam);
                    examRegisterModel.findOne({
                        exam_code: req.body.exam
                      },function(err, resResult) {
                        if (err) {
                            throw err;
                        } else {
                            if(resResult == null){
                                save(examModel,result, res);
                            }else{
                            console.log("DB: "+ resResult +" REQ: "+ req.body.exam)
                            if(resResult.exam_code != req.body.exam){
                                console.log('notEqual')
                                save(examModel,result, res);
                            }else{
                                console.log()
                                res.json({reg:'failed',message:"Already Registered",errorCode:"6001"});
                            }
                        }
                        }
                      });
                }else{
                    res.json({reg:"failed",result:"No seat available",errorCode:7012});
                }
            }
          });
    });

    function save(examModel,result,res){

        examModel.save(function(err,config){
            if(err){
                console.log(err);
                res.json(err);
            }else{
                console.log(result);
                if(result != null){
                    const reduceCount = result.remaining-1;
                    res.json({reg:'success',rem:reduceCount,e_id:result._id,errorCode:""});
                }
                res.json({reg:'success',errorCode:""});
            }
        });
    }

    //Update Exam Config 
    router.put('/update/config/:id',(req, res)=>{
        examConfigModel.findByIdAndUpdate(req.params.id,{
            $set : {remaining:req.body.rem}
        },
        {
            new : true
        },
        function(err,updatedExamConfig){
            if(err){
                console.log(err);
                res.json(err);
            }else{
                res.json({config:'success'});
            }
        })
    });
0
0
117
1

Ответы 1

Причина, по которой вы получаете ошибку Can't set headers after they are sent., заключается в том, что ваш код уже отправил ответ раньше и пытается отправить другой ответ. API отправил ответ вызванному, однако функция не вернулась, поэтому функция продолжается до тех пор, пока оператор возврата или функция не встретит конец, который является закрывающими фигурными скобками.

Пример с express.js:

router.post('/your/api', (req, res, next) => {
    //Do things here
    res.send('Sending response');  // response send

    // Doing more things, this is all right

    res.send('another response'); // Now error Can't set headers after they are sent.

   next();

}, (req, res) => {

    res.send('another response'); // Now error Can't set headers after they are sent.
});

res.send() отправляет любой ответ, а res.json() отправляет только ответ json. Используйте любой еще раз, получите ошибку Can't set headers after they are sent.

Как случайно уберечься от отправки множественного ответа?

  1. Используйте if-else эффективно.
  2. Используйте только один res.send / res.json с динамическим кодом состояния res.status(statusCode).json(result).
  3. Всегда используйте return, если после отправки ответа больше ничего делать не нужно. Пример:

`` ''

router.post('/your/api', (req, res, next) => {
    //Do things here
    return res.send('Sending response');  // response send, and function returned

    // Never came here.
    // Doing more things, this is all right

    return res.send('another response'); // Now error Can't set headers after they are sent.

   next();

 }, (req, res) => {

    // never came here as function already returned.
    return res.send('another response'); // Now error Can't set headers after they are sent.
});

`` ''

Спасибо за ваш ответ. Постараюсь реализовать ваш подход.

user2806184 14.09.2018 11:25

Другие вопросы по теме