nodeJS - запрос findOne не был преобразован в объект JSON, даже результат запроса был хорошим - PullRequest
0 голосов
/ 10 июля 2020

findOne смог найти документ в MongoDB. Однако результат не был отображен в JSON сотрудников объекта. Результат Findone был напечатан на консоли, и было ясно, что запрос вернул хороший результат.

Я новичок в Angular, NodeJS и MongoDB. Много часов было потрачено на изучение этой проблемы, но решить эту «странную» проблему не удалось. "странно", потому что findOne был инициирован "сотрудниками". и ожидаемый результат будет напрямую передан объекту employeeLs. Кроме того, это был прямой вопрос для сотрудников. Любая помощь приветствуется.

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

кодирование маршрута

const express = require('express');
const mongoose = require('mongoose');
//const Schema = mongoose.Schema;
const bodyParser = require('body-parser');
const { Console } = require('console');
const mongooseClient = require('mongoose');  /* this is important  */
var employeeLs = require('../model/staffLeave');
const staffLeaveRouter = express.Router();
const util = require('util');
staffLeaveRouter.use(bodyParser.json());
staffLeaveRouter.use(bodyParser.urlencoded({ extended: false }));

staffLeaveRouter.route('/:staff_id')
.get((req,res,next) => {
    employeeLs.findOne({staff_id : req.params.staff_id}) 
    .populate(staffRecords._id)
    .then(result => { 
        console.log(result);  
        console.log('lllll - inside retreival by staffid',JSON.stringify(util.inspect(employeeLs,{showHidden:false,depth:5})));
        /* console.dir(employeeLs,this.options); */
        employeeLs : result;
                  }
      )
    .then((employeeLs) => {
        if (employeeLs != null) 
           {res.statusCode = 200;
            res.setHeader('Content-Type', 'application/json');
            res.json(employeeLs)}
        else{
            err = new Error('Staffleave using staff ID to find '+req.params.staff_id+' not found');
            err.status = 404;
            return next(err);
        }
        
    }, (err) => next(err))
    .catch((err) => next(err));
})

Схема кодирования

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
require('mongoose-currency').loadType(mongoose);
const Currency = mongoose.Types.Currency;

const staffLeaveSchema = new Schema({
    _id: {type: mongoose.Types.ObjectId, required: true},
    staff_id: {type: mongoose.Types.ObjectId, required: true,
               ref: 'staffRecord'},
    staffUsername: {type: String, required: true},   
    year: {type: Number, required: true},
    annualLeaveEntitlement: {type: Number, required: true},
    carryOver: {type: Number, required: true},
    thisYearTotalAllowed: {type: Number, required: true},
    taken: {type: Number, required: false},
    scheduled: {type: Number, required: false},
    thisYearRemaing: {type: Number, required: false},
    sickLeaveTaken: {type: Number, required: false},
    maternityLeaveTaken: {type: Number, required: false},
    noPayLeaveTaken: {type: Number, required: false},
    familyLeaveTaken: {type: Number, required: false},
});

var staffLeave = mongoose.model('staffLeave', staffLeaveSchema);
module.exports = staffLeave;

Из журнала консоли результат findone вернул , как показано ниже. Однако система по-прежнему сообщала, что значение employeeLs по-прежнему равно нулю. Он не был обработан должным образом.

{
  _id: 5f069b7821233471ec530b80,
  staff_id: 5edfd3bf07cc253f1065de24,
  staffUsername: 'dwong',
  year: 2020,
  annualLeaveEntitlement: 10,
  carryOver: 2,
  thisYearTotalAllowed: 12,
  taken: 0,
  scheduled: 0,
  thisYearRemaing: 12,
  sickLeaveTaken: 0,
  maternityLeaveTaken: 0,
  noPayLeaveTaken: 0,
  familyLeaveTaken: 0,
  __v: 0
}

1 Ответ

0 голосов
/ 10 июля 2020

Я действительно не понимаю, чего хочет достичь этот код ниже:

.then(result => { 
        console.log(result);  
        console.log('lllll - inside retreival by staffid',JSON.stringify(util.inspect(employeeLs,{showHidden:false,depth:5})));
        /* console.dir(employeeLs,this.options); */
        employeeLs : result;
                  }
      )

вы хотите, чтобы следующий (второй) .then получил результат из first .then? если да

.then(result => { return result })
.then((employeeLs) => {
        if (employeeLs != null) 
           {res.statusCode = 200;
            res.setHeader('Content-Type', 'application/json');
            res.json(employeeLs)}
        else{
            err = new Error('Staffleave using staff ID to find '+req.params.staff_id+' not found');
            err.status = 404;
            return next(err);
        }
        
})

Позвольте мне ожидать, чего вы хотите достичь, хотите ли вы получить документ с mon goose и отправить его как ответ json? Я думаю вам просто нужно что-то вроде этого
staffLeaveRouter.route('/:staff_id')
.get((req,res,next) => {
    employeeLs.findOne({staff_id : req.params.staff_id}) 
    .populate(staffRecords._id)
    .then(result => {
      if (result) {
        res.status(200).send({data : result}) 
      } else {
        res.status(204).end()
      }
    })
    .catch(err => {
       console.log(err)
       res.status(500).send({ err : "error" })
    })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...