У вас есть проблема с областью действия.
Это пример для воспроизведения вашей проблемы:
ques
- глобальная переменная, которая обновляется в цикле for, поэтому при асинхронности Код завершается, выполнение будет считывать глобальную переменную с последним значением ques = result[i]
.
'use strict'
const result = ['a', 'b', 'c']
const mcqAll = []
var ques
for (var i = 0; i < result.length; i++) {
ques = result[i]
var sql_test_q_ops = 'SELECT op_text, op_id FROM mc_ops WHERE q_id = ' + result[i].q_id
query(sql_test_q_ops)
.then(() => {
mcqAll.push({ i: ques })
console.log(mcqAll)
})
}
function query() {
return new Promise(resolve => setTimeout(resolve, 100))
}
Но, если вы просто объявите ques
следующим образом:
for (var i = 0; i < result.length; i++) {
const ques = result[i]
const sql_test_q_op...
все будет работать.
Хорошей практикой является использование const
или let
вместо var
, поскольку последний создает опасную глобальную переменную области действия.
Что касается вашего комментария: вывод пустой, потому что этот цикл for является синхронизированным, поэтому вы отвечаете синхронизированным способом на ответ.
Пример того, как управлять этим делом, может быть таким:
'use strict'
const result = ['a', 'b', 'c']
const mcqAll = []
const promiseArray = result.map(ques => {
const sql_test_q_ops = 'SELECT op_text, op_id FROM mc_ops WHERE q_id = ' + ques.q_id
return query(sql_test_q_ops)
.then(() => { mcqAll.push({ i: ques }) })
})
// Wait for all the query to complete before rendering the results
Promise.all(promiseArray)
.then(() => {
console.log({ mcqAll });
res.render('mcqAllPage', { mcqAll })
})
.catch(err => res.send(500)) // this is an example
function query() {
return new Promise(resolve => setTimeout(resolve, 100))
}
Учтите, что существует множество возможностей для реализации этого:
in
вместо запроса для каждого q_id
и управляя результатом с помощью некоторого кода для группировки результатов Идите глубже и выберите тот, который лучше всего соответствует вашим потребностям.
Важно: .catch
всегда цепочка обещаний!
Для удовлетворения Вас требования, Вы будете использовать Аутентификацию Форм с Членством. Если Ваше приложение использует базу данных SQL Server, можно использовать SQLMembershipProvider в качестве поставщика членства для достижения этого.
Исследуя ASP.NET 2.0's Членство, Роли и Профиль могут быть ссылкой хорошего начала.
О Вашей озабоченности по поводу передающих паролей как простой текст, когда соединение не защищается.
На самом деле пароли, которые отправляются, обычно хешируются (алгоритм будет зависеть от выбранного Поставщика Членства), и это - поскольку там в конечном счете хранятся. Конечно, если соединение не защищается, что хешированный пароль может получаться и использоваться для взламывания приложения, но по крайней мере Вы устраняете возможность, что простой пароль пользователя крадется и используется, например, получить доступ к другому сервису (поскольку Вы знаете, что многие люди используют тот же пароль через многочисленные услуги). Таким образом, чтобы быть безопасными действительно необходимо использовать https здесь.
Как предупреждение, я далек от того, чтобы быть экспертом в том поле, но совсем недавно я сталкивался с подобной проблемой, которую Вы описываете так я, хотя это можно найти часть этого полезной.
Аутентификация форм не делает передает пароли обратно как простой текст. Пока Вы удостоверяетесь, что вход в систему защищен при получении его (т.е. с помощью https... ssl) там нет никакой угрозы безопасности.
Если действительно необходимо сделать авторизацию тот путь, можно полагаться на аутентификацию форм для... аутентификации и сделать авторизацию с собственным механизмом.
Автор форм является отличным выбором для того, что Вы после. Это поддерживает роли, но это не поддерживает группы. Однако это действительно имеет созданным в поддержке интеграции Active Directory, которую можно использовать для облегчения проблемы группы при необходимости. Лично, я придерживался бы с тем, что Вы имеете и узнаете больше о нем. Если бы Вы хотите использовать режим Forms Автора Форм, а не AD подлинный режим, я рассмотрел бы построение на поддержке группы с помощью существующей базы данных автора форм.
Я настоятельно рекомендую смотрение этих видео от Microsoft об аутентификации форм. Вы найдете, что это является довольно прямым для использования. Предоставленный, это не что-то, что можно бросить вместе, поскольку это - довольно устойчивая и гибкая платформа. Вы захотите читать на нем и смотреть эти видео. Однако, когда Вы знакомитесь с ним, Вы найдете, что это безопасно, поддерживается и очень хорошо принятое сообществом разработчиков.
Yikes, я просто рассмотрел Ваш вопрос снова, и Вы сказали, что они не используют SSL. Насколько безопасный этот сайт должен быть? Мне, который был бы моей первостепенной задачей, должен переместиться в SSL!
Аутентификация форм не будет группы поддержки исходно. То, что мы делаем, использовать его, чтобы "пройти проверку подлинности", пользователь (докажите, кто они), и затем мы используем наши собственные хранилища данных для "авторизовывания" пользователя (опишите то, что они могут сделать).
Спасибо за весь вход. Хотя я думаю, что продолжу пользоваться своей собственной библиотекой аутентификации в других проектах, я думаю, что лучшая вещь сделать для этого клиента состоит в том, чтобы придерживаться аутентификации форм, которую они уже имеют частично на месте.
Хотя я разрабатываю с Visual Studio и платформой .NET, мне не всегда нравится делать вещи "Microsoft" путь. Я нахожу, что много раз "Microsoft", путь представляет много издержек, которых можно избежать, если Вы знаете то, что Вы делаете.
Еще раз спасибо за вход.
дб не хранит простой текст пароля, он использует md5 или некоторые другие средства хеширования... я знаю, что они соответствуют 2 хешированным строкам друг против друга автору, преобразовывают ли они строковую сторону клиента или сторону сервера, я не уверен.. вероятно, браузер..., если Вы думаете об использовании ssl, я не думаю, что необходимо использовать автора форм ASP.net... его время для Вас, чтобы сделать Вашего собственного основанного на формах автора и погружение в к некоторой горной промышленности рекламы....