javascript - Usando async.js para poblar profundamente sails.js
arrays object (1)
Use .toJSON()
antes de sobrescribir cualquier asociación en el modelo.
De lo contrario, la implementación predeterminada de toJSON
anula cualquier cambio realizado en los datos asociados al modelo.
var userFinal = data.user.toJSON(); // Use of toJSON
userFinal.trips = data.isLiked;
return res.json(userFinal);
En otra nota, use JS .map
o _.map
en lugar de async.map
ya que no hay una operación asincrónica en la función interna. De lo contrario, es posible que se enfrente a RangeError: Maximum call stack size exceeded
problema del RangeError: Maximum call stack size exceeded
.
Además, podría ser mejor devolver cualquier respuesta de devolución de llamada final solamente. (Elimine res.negotiate
, res.badRequest
del primer argumento de async.auto
). Permite hacer terminal de método de respuesta
Tengo un gran problema con mi función en sails.js (v12). Estoy tratando de obtener todo userDetail usando async (v2.3) para llenar profundamente mi información de usuario:
UserController.js:
userDetail: function (req, res) {
var currentUserID = authToken.getUserIDFromToken(req);
async.auto({
//Find the User
user: function (cb) {
User
.findOne({ id: req.params.id })
.populate(''userFollowing'')
.populate(''userFollower'')
.populate(''trips'', { sort: ''createdAt DESC'' })
.exec(function (err, foundedUser) {
if (err) {
return res.negotiate(err);
}
if (!foundedUser) {
return res.badRequest();
}
// console.log(''foundedUser :'', foundedUser);
cb(null, foundedUser);
});
},
//Find me
me: function (cb) {
User
.findOne({ id: currentUserID })
.populate(''myLikedTrips'')
.populate(''userFollowing'')
.exec(function (err, user) {
var likedTripIDs = _.pluck(user.myLikedTrips, ''id'');
var followingUserIDs = _.pluck(user.userFollowing, ''id'');
cb(null, { likedTripIDs, followingUserIDs });
});
},
populatedTrip: [''user'', function (results, cb) {
Trip.find({ id: _.pluck(results.user.trips, ''id'') })
.populate(''comments'')
.populate(''likes'')
.exec(function (err, tripsResults) {
if (err) {
return res.negotiate(err);
}
if (!tripsResults) {
return res.badRequest();
}
cb(null, _.indexBy(tripsResults, ''id''));
});
}],
isLiked: [''populatedTrip'', ''me'', ''user'', function (results, cb) {
var me = results.me;
async.map(results.user.trips, function (trip, callback) {
trip = results.populatedTrip[trip.id];
if (_.contains(me.likedTripIDs, trip.id)) {
trip.hasLiked = true;
} else {
trip.hasLiked = false;
}
callback(null, trip);
}, function (err, isLikedTrip) {
if (err) {
return res.negotiate(err);
}
cb(null, isLikedTrip);
});
}]
},
function finish(err, data) {
if (err) {
console.log(''err = '', err);
return res.serverError(err);
}
var userFinal = data.user;
//userFinal.trips = data.isLiked;
userFinal.trips = "test";
return res.json(userFinal);
}
);
},
Intenté casi todo para obtener esta solución pero nada está funcionando ... Puedo obtener mi variedad de viajes (data.isLiked) pero no pude obtener mis viajes de UserFInal.
Intento establecer el valor de cadena en el userFinal.trips:
Respuesta JSON
{
"trips": [], // <-- my pb is here !!
"userFollower": [
{
"user": "5777fce1eeef472a1d69bafb",
"follower": "57e44a8997974abc646b29ca",
"id": "57efa5cf605b94666aca0f11"
}
],
"userFollowing": [
{
"user": "57e44a8997974abc646b29ca",
"follower": "5777fce1eeef472a1d69bafb",
"id": "5882099b9c0c9543706d74f6"
}
],
"email": "[email protected]",
"userName": "dany",
"isPrivate": false,
"bio": "Hello",
"id": "5777fce1eeef472a1d69bafb"
}
Pregunta
¿Cómo debo hacer para que mi matriz de viajes (isLiked) pegue en mi matriz de viajes de usuario? ¿Por qué mis resultados no son lo que espero tener?
Gracias por sus respuestas.