Обработка объектов базы данных в узле js

#javascript #node.js #express

Вопрос:

В общем, как javascript интерпретирует Database {} объект? Я пишу несколько внутренних сценариев для обработки проверки регистрационной формы. В частности, мне нужно убедиться, что имя пользователя и адрес электронной почты, используемые для регистрации, в настоящее время не используются. Для этого я использую пакет sqlite3 и с помощью нескольких db.get вызовов определяю, есть ли в моей базе данных существующие записи для имени пользователя и электронной почты, используемых в регистрационной форме. Я хочу использовать возврат db.get , чтобы проверить, пусто оно или нет, и использовать это условие для выполнения необходимой задачи. Однако db.get возвращает Database {} объект, с которым я не знаю, как работать.

Надеюсь, следующее псевдо лучше описывает проблему. Здесь uname возвращается Database {} и поэтому никогда не подводит оператор if.

 function existance(username, email) {
    
    let uname = db.get(sql, username, callback(err, throw));
    
    if (uname) {
        let errors = {username: 'Username already in use.'};
        return errors;
    }
    
};
 

Редактировать

С тех пор я воспользовался рекомендацией Гаджиу, но все еще испытываю проблемы. Итак, у меня есть два файла:

registrant_existence.js

 // necessary requirements and initialisation

function registrant_existence(username) {

    let uname;
    let sql = 'SELECT username FROM table WHERE username=?';
    
    db.get(sql, username, function(err, row) {
    if (err) {
        throw err;
    } else {
        uname = row;
        console.log(uname);
    }
    });
    
    console.log(uname);
    
    if (uname !== undefined) {
        return {username: 'Username already in use.'};
    } else {
        return 'DNE';
    }
    
};

module.exports = registrant_existence;
 

register.js

 let registrant_existence = require("path to registrant_existence.js");

// necessary requirements and initialisation

router.post('/', function(req, res) {
    
    let existence = registrant_existence(req.body.username, req.body.email);
    
    if (existence != 'DNE') {
        // render registration page notifying the user
        // that the username is already in use
    } else {
        // register the new user details
    }
    
});
 

uname Переменная всегда не определена. Я поместил console.log(uname) их в двух местах в registrant_existence.js как видно выше, чтобы увидеть, что происходит. Происходят две странные вещи.

Во-первых, console.log(uname) снаружи db.get() отображается undefined консоль, а console.log(uname) внутри db.get() отображается ожидаемая строка (имя пользователя, которое, как я знаю, есть в моей базе данных).

Во-вторых, console.log(uname) внешнее значение db.get() отображается перед console.log(uname) _внутреннем db.get() в моей консоли.

Я понятия не имею, почему все это происходит. У кого-нибудь есть какие-нибудь предложения?

Ответ №1:

Тебе стоит попробовать что-нибудь в этом роде:

 db.get(sql, username, (err, data) => {
    // process the data here 
    if (err) {
    return console.error(err.message);
  }
  return data
    ? console.log(data.id, data.userName)
    : console.log('No username found');
});
 

Комментарии:

1. Я не думаю, что это сработает. Я хочу встроить db.get() его в другую функцию, и поэтому мне понадобится «внешняя» функция для возврата, если db.get() возвращает непустую запись. То, что вы предложили, вернет только функцию обратного вызова внутри db.get() , а не мою «внешнюю» функцию.

2. На самом деле я понял, что вел себя глупо. Ваше решение работает. Я просто определил переменную снаружи db.get и обновил ее с помощью функции обратного вызова.

3. @Zeta-Квадрат Я рад, что это сработало для вас, пожалуйста, примите мой ответ, это помогло вам

4. На самом деле это не сработало. Я продолжаю получать результат, который не определен, хотя я знаю, что в базе данных есть соответствующая запись. Основной пост будет отредактирован.

Ответ №2:

Я предполагаю, что вы ищете оболочку вокруг своего объекта базы данных, что-то вроде объектно-реляционного картографа (ORM), который регулярно используется https://sequelize.org/master/manual/getting-started.html

С другой стороны, для вашего конкретного случая использования вы, возможно, захотите взглянуть на это https://www.sqlite.org/lang_createtable.html#unique_constraints: единство обычно достигается за счет ограничений в хранилище данных.