NodeJS与Express和Mongoose试图从另一个中间件调用一个中间件



我正在尝试重用我在两个不同的 NodeJS 控制器中的代码,但我似乎不明白 java 调用是如何工作的。数据来自使用Mongoose的MongoDB

我可以调用图片代码 - findMyBoatPictures本身很好,但是当我尝试从船控制器代码中这样做时 - findMyForSale我的跟踪是

跟踪从 NodeJS 生成此内容

 in boats findMyBoatPictures
 picture found records: 3

所以找到了 3 条记录,但之后它消失在某处,我看不到在哪里

任何帮助将不胜感激

我试图实现的是,在获得三条记录后,我想将每条记录的一部分添加到 Boat.find 中返回的第一条船记录中,然后对每条船记录重复此过程

图片.路线.js

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

船路线.js

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

船控制器.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
        });
    });
};

图片.控制器.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
            });
        });
};

问题:图片控制器功能findMyBoatPicturesres.json响应请求。它不会将控件传递回调用它findMyForSale方法。

溶液:如果有一些代码要重用,请将其抽象到两个控制器都使用的服务中。该服务可以使用回调将控件传回,然后控制器可以使用彼此独立的res.json响应请求。

首先,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 和 await,您甚至可以减少代码行数

最新更新