2016-01-26 2 views
1

, безусловно, есть способ сделать это в гораздо меньшем количестве строк кода., запрашивающий две таблицы в sequelize

базы данных не самые сильные, и я новичок в секвестировании и узле. Идентификатор пользователя входит как параметр, и я должен проверить, есть ли пользователь в таблице пользователя. Если ни один пользователь не отправляет обратно никому другому, не проверяйте таблицу pics, чтобы увидеть, есть ли у пользователя рис. userid является символом forign в таблице pics. если у пользователя нет pic, я даю им по умолчанию другой мудрый, я установил их pic как сохраненный в базе данных. У меня есть работа, но я знаю, что это может быть написано намного лучше с меньшим количеством строк кода, использующих findAll, но я не могу его получить. Любая помощь оценивается. Вот код, который работает ..

users.findById(userId) 
    .then(function (user) { 
     if (!user) { 
      res.render('error', { 
       message: 'No user found with id of ' + userId, 
       error: { 
        status: 404 
       } 
      }); 
     } else { 
      pics.findOne({ 
       where: { 
        user_id: userId 
       }, 
       attributes: ['profile_pic_filename'] 
      }).then(function (pic) { 
       if (!pic) { 
        //if no pic give a default 
        profilepic = process.env.DEFAULT_PROFILE_PIC; 
       } else { 
        profilepic = CDNPath + pic.profile_pic_filename; 
       } 

       res.render('user', { 
         profilePic: profilepic, 
         firstname: user['first_name'], 
         username: user['username'], 
         surname: user['surname'], 
         email: user['email']} 
       ); 
      }); 
     } 
    }); 

ответ

0

есть, конечно, какой-нибудь способ, чтобы это было сделано в гораздо меньше строк кода.

Вы можете поместить все это на одной линии, если вы его уменьшите: D!

Шутки в сторону ...

.findOne функция возвращает обещание.

В отличие от обратных вызовов, с прошивками, если есть ошибка брошена, она будет поймана путем размещения catch функция. Все, что вам нужно сделать, это поместить ошибку в catch и не беспокоить первый запрос.

pics.findOne({ where: { user_id: userId }, attributes: ['profile_pic_filename']}) 
    .then(pic => { 
     var profilepic = process.env.DEFAULT_PROFILE_PIC; 
     if (pic) profilepic = CDNPath + pic.profile_pic_filename; 

     res.render('user', { 
      profilePic: profilepic, 
      firstname: user['first_name'], 
      username: user['username'], 
      surname: user['surname'], 
      email: user['email']} 
     ); 
    }) 
    .catch(e => { 
     // test the error is what you were expecting. 
     return res.render('error', 
      { message: 'No user found with id of ' + userId, error: { status: 404 }}); 
    }); 
+0

Уменьшение пробелов - это не оптимизация в каком-либо смысле и требует затрат на удобочитаемость и обслуживание (примечание: я не являюсь нисходящим). – Wtower

+0

@Wtower: Не стоит беспокоиться. Я ответил слишком быстро. Я исправил код (перед тем, как вы прокомментировали), чтобы использовать catch, что хотел OP (т. Е. Одна операция с базой данных). Тем не менее, начальные изменения, которые я сделал, были исключительно для улучшения читаемости. Я использую ранние возвращения и функцию жира стрелки все время, чтобы уменьшить напряжение глаз и thats на основе хороших рекомендаций стиля. – chriskelly

+0

Это, безусловно, выглядит лучше Крис – Wtower

Смежные вопросы