我正在学习使用 Node.js + Express 构建 REST API。在这个API中 我有以下方法:
apiRouter.route('/training/session/byId/:id_session')
// ===== GET =======
.get(function(req, res) {
//Get the session
Session.findById(req.params.id_session, function(err, session) {
//Get an array of exercise associated with the session
Exercise.find({session: session._id}, function(err, exercise) {
let movements = [];
let sets = [];
let i = exercise.length-1;
//For every exercise get the movements and the sets
exercise.forEach(function (ex,index) {
Movement.findById(ex.movement,function(err,movement){
if(movement)
movements.push(movement);
//***** Here?
Set.find({exercise: ex}, function (err, set) {
if(set.length)
sets.push(set);
if(index == i){
res.json({ message: 'ok' ,session,exercise,movements,sets});
}
})
})
})
});
});
})
这个想法是从数据库中获取所有与 session 相关的信息。
第一: 我认为这不是进行多个查询并返回一个包含所有查询信息的对象的正确方法,但我对 Node 的异步工作是新手......那么进行多个查询的正确方法是什么?一个查询的数据依赖于其他查询?
第二:在前端(React + Redux)中,我使用 axios 发出 Ajax 请求,对于同一个 Ajax 请求,有时并非获取所有“集合”(//*** ** 这里?)。问题出在 API 上?
提前致谢。
编辑:数据库模型
session :
var SessionSchema = new Schema({
date: {type: Date, default: Date.now },
time: Number, //Time in seconds
user: {required: true, type: mongoose.Schema.Types.ObjectId, ref: 'User'},
});
练习:
var ExerciseSchema = new Schema({
session: {type: mongoose.Schema.Types.ObjectId, ref: 'Session'},
movement: {type: mongoose.Schema.Types.ObjectId, ref: 'Movement'},
timestamp: {
type: Date,
default: Date.now
}
});
设置:
var SetSchema = new Schema({
repetitions: Number,
weight: Number,
rest: Number,
timestamp: {
type: Date,
default: Date.now
},
exercise : {type: mongoose.Schema.Types.ObjectId, ref: 'Exercise'}
});
运动:
var MovementSchema = new Schema({
name: { type: String, required: true, index: true, unique: true },
material:{ type: String, required: true},
muscles : [{
name : { type: String, required: true},
percentage : { type: Number, required: true}
}]
});
最佳答案
Set.find({exercise: ex}, function (err, set) {
if(set.length)
sets.push(set);
}).then(function(set){
if(index == i){
res.json({ message: 'ok' ,session,exercise,movements,sets});
}
})
当然,我之前的回答是行不通的。设置查询回调将在 if(index == i) 之后执行。实际上我不确定这会产生与您的代码不同的结果。我从未真正使用过 Mongoose,但据我所知,您无法进行联接,因此嵌套查询是实现这一点的方法。
您可能需要考虑使用 promise 。不是必需的,但它们使您的代码更易于阅读和思考:http://eddywashere.com/blog/switching-out-callbacks-with-promises-in-mongoose/
创建一个在查询返回时构建的单个结果对象可能更有意义,这样您最终会发送一个代表 session 的 JSON 对象,如下所示:
{
exercises: [
{
sets: [],
movements: [],
},
{
sets: [],
movements: [],
},
...
]
}
关于javascript - Node.js API 对于同一请求返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40391943/