У меня есть такая схема:
var MusicSchema = new Schema({
music_genres:[{
type:Schema.Types.ObjectId,
ref:'music_genres',
}],
music: {
type:String,
required:true,
},
});
теперь во внешнем интерфейсе у меня есть множественный выбор, где пользователь выбирает один или несколько разных музыкальных жанров.
so when clicked submit, sometimes I get (if user chose only one genre) - 5cab466ed076761558a76148 or if multiple - [ '5cab466ed076761558a76148', '5cab4915d076761558a7614a' ].
Итак, если пользователь выбрал только 1 жанр, это строка, но если пользователь выбрал несколько, это массив.
router.post('/',async (req,res)=>{
const newMusic = new Music();
if (typeof req.body.music_genres === "string") req.body.music_genres = [req.body.music_genres];
for(var i in req.body.music_genres) newMusic.music_genres.push(req.body.music_genres[i]);
await newMusic.save();
Вопрос: Я ненавижу, когда я пишу оператор if и проверяя, является ли он строкой, делаю его массивом. Я также ненавижу заявления. Есть ли способ сделать этот код лучше без цикла if и for?
Если вы хотите удалить цикл for из кода, вы должны использовать функцию мангуста insertMany
, как вы можете видеть в ее официальном документе здесь документ, вы можете передать массив этой функции, тогда она будет обрабатывать массовое создание.
но для вашей первой проблемы я думаю, что лучший подход - сделать тело запроса интегрированным со стороны клиента, чтобы вы могли легко сделать строку массивом с одним элементом в нем, я думаю, что это будет лучше для согласованности кода на стороне сервера.
Вы можете использовать тройку с спред оператор вместо цикла с push()
router.post('/',async (req,res)=>{
const newMusic = new Music();
typeof req.body.music_genres === "string" ? newMusic.music_genres =
[req.body.music_genres]: newMusic.music_genres = [...req.body.music_genres];
await newMusic.save();
Пример
let foo = 'foo';
let arr = ['a', 'b'];
let bar = [];
a = foo;
typeof a == 'string' ? bar = [a] : bar = [...a];
console.info(bar);
вы можете предоставить код, как вы это сделаете? потому что я сохраняю insertMany не в своей музыкальной модели, а в моем поддокументе music.music_genres