NodeJS с Express и Mongoose пытаются вызвать один кусок промежуточного программного обеспечения из другого - PullRequest
0 голосов
/ 27 января 2019

Я пытаюсь повторно использовать мой код на двух разных контроллерах NodeJS, но, похоже, я не понял, как работают вызовы Java.Данные поступают из MongoDB с использованием Mongoose

. Я могу назвать код изображения - сам по себе findMyBoatPictures нормально, но когда я пытаюсь сделать это из кода контроллера лодки - findMyForSale, моя трассировка составляет

трассировка.производит это из NodeJS

 in boats findMyBoatPictures
 picture found records: 3

Таким образом, 3 записи найдены, но после этого они куда-то исчезают, и я не могу видеть, где

Любая помощь будет принята с благодарностью

Что яя пытаюсь добиться того, чтобы после получения трех записей я хотел добавить часть каждой записи в первую из моих записей лодки, которые были возвращены в Boat.find, а затем повторить этот процесс для каждой записи лодки

picture.routes.js

module.exports = function(app) {
    const picture = require('../controllers/picture.controller.js');
    // Retrieve all by boat Id
    app.get('/api/pictures/:boatId', picture.findMyBoatPictures);
}

boat.routes.js

module.exports = function(app) {
    const boats = require('../controllers/boat.controller.js');
    // Retrieve all Boats for sale
    app.get('/api/boatsforsale/:agentId', boats.findMyForSale);
}

boat.controller.js

const Boat = require('../models/boat.model.js');
const picture = require('../controllers/picture.controller.js');

// FETCH all Boats for sale by specified agent
exports.findMyForSale = (req, res) => {
    var query = { sellingAgent: "1" }; // fixed to 1 for testing
    Boat.find(query)
    .then(boats => {
        req.params.boatId = boats[0].boatId;
        var pics;
        picture.findMyBoatPictures(myCall, res, function (pics) { 
            if (pics) {
                console.log("find pics #1 result is " + JSON.stringify(pics));
            } 
            else {
            console.log("find pics #2 result is " + JSON.stringify(pics));
            }
            res.json(boats);
        });
    }).catch(err => {
        console.log("findMyForSale failure is " + JSON.stringify(err));
        res.status(500).send({
            msg: err.message
        });
    });
};

picture.controller.js

const Picture = require('../models/picture.model.js');
exports.findMyBoatPictures = (req, res) => {
    console.log("in boats findMyBoatPictures")
    var query = { owningId: String(req.params.boatId) };
    var orderBy = { sequenceNumber: 1 };
    Picture.find({ owningId: String(req.params.boatId) }).sort({ sequenceNumber: 1 })
        .then(pics => {
            console.log("picture found records: " + pics.length);
            res.json(pics);
        }).catch(err => {
            console.log("picture found error " + err.message);
            res.status(500).send({
                msg: err.message
            });
        });
};

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Прежде всего, функция export.findMyBoatPictures принимает два аргумента req и res, но вы не инициируете его правильно, это то, что вы должны сделать

picture.findMyBoatPictures(req, res);

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

const Picture = require('../models/picture.model.js');
exports.findMyBoatPictures = (req, res, callback) => {
    console.log("in boats findMyBoatPictures")
    var query = { owningId: String(req.params.boatId) };
    var orderBy = { sequenceNumber: 1 };
   Picture.find({ owningId: String(req.params.boatId) 
}).sort({ sequenceNumber: 1 })
    .then(pics => {
        console.log("picture found records: " + pics.length);
        callback(false, pics)
    }).catch(err => {
        console.log("picture found error " + err.message);
        callback (err)
    });

Затем вы делаете

  let pics;
   picture.findMyBoatPictures(req, res, function (err, pics) 
  { 
        if (!err && pics) {
               console.log("find pics #1 result is " + 
              JSON.stringify(pics));
               pics = pics;
           // Send ur response

        } 
        else {
             console.log(err);
            // Send ur response
        }
    });

. Вы можете даже сократить количество строк кода, если используете async и ожидаете

0 голосов
/ 27 января 2019

Проблема: Функция контроллера изображения findMyBoatPictures отвечает на запрос res.json.Он не передает управление обратно методу findMyForSale, из которого он был вызван.

Решение: Если у вас есть код для повторного использования, абстрагируйте его в сервисе, которыйиспользуется обоими контроллерами.Эта служба может передать управление обратно с помощью обратного вызова, а затем контроллеры могут ответить на запросы с res.json независимо друг от друга.

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