我正在尝试重用我在两个不同的 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
});
});
};
问题:图片控制器功能findMyBoatPictures
用res.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,您甚至可以减少代码行数