#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: единство обычно достигается за счет ограничений в хранилище данных.