Запрос MongoDB внутри запроса - PullRequest
0 голосов
/ 13 сентября 2018

Я новичок в mongoDB, Nodejs и выражу вашу помощь будет более ценно.

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

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


Ошибка: невозможно установить заголовки после их отправки.в validateHeader (_http_outgoing.js: 491: 11) в ServerResponse.setHeader (_http_outgoing.js: 498: 3) в ServerResponse.header (C: \ practice \ angular2 \ student-reg-app \ node_modules \ express \ lib \ response.js: 767: 10) в ServerResponse.send (C: \ practice \ angular2 \ student-reg-app \ node_modules \ express \ lib \ response.js: 170: 12) в ServerResponse.json (C: \ practice \ angular2 \student-reg-app \ node_modules \ express \ lib \ response.js: 267: 15) в C: \ Practice \ angular2 \ student-reg-app \ server \ rout \ api.js: 208: 17 в C: \ Practice\ angular2 \ student-reg-app \ node_modules \ mongoose \ lib \ model.js: 4495: 16 в модели. $ __ save.error (C: \ practice \ angular2 \ student-reg-app \ node_modules \ mongoose \ lib \ model.js: 396: 7) в C: \ practice \ angular2 \ student-reg-app \ node_modules \ kareem \ index.js: 315: 21 в следующем (C: \ practice \ angular2 \ student-reg-app \ node_modules \kareem \ index.js: 209: 27) в Kareem.execPost (C: \ practice \ angular2 \ student-reg-app \ node_modules \ kareem \ index.js: 217: 3) в _cb (C: \ practice \ angular2 \студент-рег-приложение \ node_modules \ Карим \ index.js: 307:15) в $ __ handleSave (C: \ practice \ angular2 \ student-reg-app \ node_modules \ mongoose \ lib \ model.js: 310: 5) в C: \ practice \ angular2 \ student-reg-app \ node_modules\ mongoose \ lib \ model.js: 193: 7 в результате (C: \ practice \ angular2 \ student-reg-app \ node_modules \ mongodb \ lib \ utils.js: 414: 17) в session.endSession (C: \практика \ 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'});
            }
        })
    });

1 Ответ

0 голосов
/ 13 сентября 2018

Причина, по которой вы получаете ошибку 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.
});

`` `

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...