Я создал удаленный метод для выполнения нескольких запросов к моей БД, где я хочу найти или создать до 12 пользовательских моделей одновременно. В обозревателе обратной связи я передаю этот массив ["player0", "player1", "player2"]
своей функции, которая, как я знаю, уже находится в моей БД. Однако проблема, с которой я сталкиваюсь, заключается в том, что мне возвращается статус 200 и массив нулевых значений. Если я передаю имена, которых нет в БД, мне возвращается объект для каждого имени со всеми значениями по умолчанию, как и ожидалось.
Итак, мой вопрос: что не так с частью поиска моего кода?
Я попытался добавить предложение where в мой findOrCreate, и он все еще возвращает массив нулей.
ОБНОВЛЕНИЕ: ЗДЕСЬ ВЕСЬ МЕТОД
function getPlayerStats(names) {
console.info('names: ', names);
return new Promise((resolve, reject) => {
const { Player } = app.models;
const playerData = names.map(name => {
console.info('single name: ', name);
const defaultSkill = 1500;
return Player.findOrCreate(
{ where: { name: name } },
{
name: name,
careerSkill: defaultSkill,
careerHighestSkill: defaultSkill,
careerWins: 0,
careerLosses: 0,
careerPercent: 0,
careerBestLeader: 'none',
careerAllLeader: ['none'],
highestCareerSkill: defaultSkill,
careerSeasonWins: 0,
careerSeasonLosses: 0,
careerSeasonPercent: 0
}
);
});
Promise.all(playerData)
.then(results => resolve(results))
.catch(err => reject(new Error('could not return results')));
});
}
module.exports = { getPlayerStats };```
Я думаю, что вы должны добавить return
перед Player.findOrCreate({name: name},
Player.findOrCreate({ where: { name: name } },...
— правильная версия фильтра.
Кроме того, вы можете опустить этот обратный вызов (err) => {
, потому что у вас есть блок catch
Вся функция может выглядеть так:
player.js
Player.getPlayerStats = function (names, cb) {
const playerPromises = names.map(name => {
const defaultSkill = 1500;
return Player.findOrCreate({ where: { name: name } }, {
"name": name,
"careerSkill": defaultSkill,
"careerHighestSkill": defaultSkill,
"careerWins": 0,
"careerLosses": 0,
"careerPercent": 0,
"careerBestLeader": "none",
"careerAllLeader": ["none"],
"highestCareerSkill": defaultSkill,
"careerSeasonWins": 0,
"careerSeasonLosses": 0,
"careerSeasonPercent": 0
})
})
Promise.all(playerPromises)
.then(players => cb(null, players))
.catch(err => cb(new Error('could not return results'), null))
}
Хорошо, проверьте мое редактирование и как выглядит ваше объявление remoteMethod?
хорошо, я обновил исходный пост, чтобы включить весь метод
ок, а как вы прописываете этот метод? У вас должно быть что-то вроде Player.remoteMethod(...
Правильный. Я определил Player.remoteMethod в /models/Player.js
На самом деле теперь все работает, спасибо! Осталось добавить return
к Player.findOrCreate...
Хорошо, это некоторый прогресс. Я добавил в
return
перед добавлениемPlayer.findOrCreate({name: name},
в предложениеwhere
и удалил(err) => {
Все новые имена в массиве создаются в БД, однако тело ответа всегда возвращает только первого найденного или созданного игрока. Чего еще мне не хватает, чтобы вернуть все данные игроков, которые я передал функции.