2017-01-03 3 views
-2

Я новичок в node.js, и я хочу использовать обещания в своем школьном проекте. я нашел несколько вещей в Интернете и на стеке: Use promise to process MySQL return value in node.jsPromises Node.js mysql

Но у меня есть вопрос, до сих пор, это то, что у меня есть:

router.post('/matchaSearch', function(req, res) { 
    var username = session.uniqueID; 
    var searcherPackage = {}; 

    function userAgeCheck(randomParam) { 
    return new Promise((resolve, reject) => { 
     pool.getConnection((err, connection) => { 
     var query = 'SELECT username, age, orientation, sex FROM usersinfo WHERE username != ?'; 
     connection.query(query, [username], (err, rows, fields) => { 
      connection.release(); 
      return err ? reject(err) : resolve(rows); 
     }); 
     }); 
    }); 
    } 

    userAgeCheck('username') 
    .then((rows) => { 
     /*console.log(rows);*/ 
     searcherPackage = rows; 
     console.log(searcherPackage); 
     // do stuff 
    }).catch((err) => { 
     throw err; 
    }); 
}); 

Это работает для меня, она возвращает мне все от db кроме меня (имя пользователя). Но для меня это неправильно. Почему предоставление случайного параметра является хорошим?

Поэтому я должен указать «username» как param вместо «randomParam», но если я это сделаю, запрос вернет мне все вместо всех, кроме меня (имя пользователя). Так что я избавился от него и просто дал ему «randomParam», и он сработал. Можете ли вы это объяснить? Правильно ли я это делаю? Если это так, я могу продолжать делать свой проект. Спасибо за помощь!

+0

В цитируемом коде не используется функция 'randomParam'. Это ваш код, не так ли? Так почему это так? Что он должен был делать? –

+1

Вам нужно также проверить 'err' в обратном вызове' pool.getConnection'. Или, еще лучше, используйте библиотеку, такую ​​как Bluebird, и обещайте эти методы, чтобы вы могли правильно связать их и позволить любой ошибке автоматически отклонять возвращенное обещание. – cdhowie

+0

Не забывайте, что 'Promise.promisify' может использоваться для преобразования методов обратного вызова типа Node.js в автоматические обещания, поэтому вам не нужно писать собственную оболочку. – tadman

ответ

1

Когда вы вызываете userAgeCheck (userAgeCheck('username')), вы передаете один аргумент: строковый литерал, содержащий слово «имя пользователя». Это присваивается randomParam, который затем никогда не пользователь, что делает его бессмысленным.


Вы определяете переменную в верхней части вашего скрипта: var username = session.uniqueID;

Когда вы делаете запрос вы передаете значение username переменной в качестве значения заполнителя для username != ?.

Это значение session.uniqueId, так как оно считывает переменную username из более широкой области.

Следовательно, вы возвращаете все результаты, кроме тех, где имя пользователя является именем пользователя в session.uniqueId.


Если переименовать randomParam в username, то у вас есть новый, местной переменной username со значением "username".

Следовательно, вы возвращаете все результаты, кроме тех, где имя пользователя является именем пользователя буквально имя пользователя.


Если вы хотите передать имя пользователя в качестве аргумента, то вам нужно изменить userAgeCheck('username') к userAgeCheck(username). т. е. заменить строковый литерал на имя переменной.

+0

Спасибо за ваш ответ, так что вы говорите: мое [имя_пользователя] в моем connection.query как значение моего var username = session.uniqueID в верхней части моего кода? Итак, когда я объявляю функцию 'function userAgeCheck (randomParam)' Должен ли я дать ему какой-либо параметр? Зачем мне это делать и какой? – pkerckho

+0

@pkerckho - Если вы не собираетесь использовать параметр, то не определяйте его в списке аргументов и не передавайте его при вызове функции. Если вы собираетесь использовать его, используйте одно и то же имя везде и передайте переменную * *, которую вы хотите передать, вместо строкового литерала. – Quentin

+0

ok Получаю, спасибо за вашу помощь! Я собираюсь создать дюжину, если крошечная функция без каких-либо параметров, и получить все данные из моего db, поместив их в объекты, а затем создать последнюю функцию с моими объектами в качестве параметров. Я думаю, что это правильная идея! Спасибо чувак ! – pkerckho