#javascript #jquery #node.js #express #basic-authentication
#javascript #jquery #node.js #экспресс #basic-аутентификация
Вопрос:
Я создаю веб-приложение, которое позволяет игрокам Fortnite находить других игроков для игры. Пользователи должны иметь возможность регистрироваться, входить в систему, публиковать и комментировать. Я разработал интерфейсную часть функций входа и регистрации пользователя, а также серверную часть регистрации пользователя, но одно из моих требований заключается в том, что:
Перед регистрацией сервер должен проверить, является ли указанное имя пользователя реальным именем пользователя Fortnite, используя FortniteTracker API, который предоставляет профили пользователей с использованием их очень простого API.
Пример вызова: GET https://api.fortnitetracker.com/v1/profile /{платформа}/{эпический ник}
Как мне проверить, что имя пользователя существует, прежде чем разрешить пользователю создать учетную запись?
Я попытался создать отдельную конечную точку для вызова API со стороны сервера, но я не знал, как реализовать ее в моей конечной точке / register
script.js
function registerRequest(username,password) {
$.ajax({
url: "http://localhost:8080/register",
type: 'POST',
data: JSON.stringify({username,password}),
contentType: "application/json",
error : function(err) {
console.log('Error here!', err)
},
success: function(data) {
console.log('Success!')
// What do I put here?
}
});
}
function handleRegisterSubmit(event) {
event.preventDefault();
const username = $(event.currentTarget).find('.username-register').val()
const password = $(event.currentTarget).find('.password-register').val()
const passwordConfirm = $(event.currentTarget).find('.password-confirm').val()
if (password === passwordConfirm) {
registerRequest(username,password)
}
else {
console.error("Passwords did not match")
}
}
$(function onLoad() {
displayRegisterPage()
$(`.js-content-section`).on('submit', '.js-register-form', handleRegisterSubmit)
}
})
server.js
app.post('/register', jsonParser, (req, res) => {
const requiredFields = ['username', 'password']
for (let i = 0; i < requiredFields.length; i ) {
const field = requiredFields[i]
if (!(field in req.body)) {
const message = `Missing `${field}` in request body`
console.error(message)
return res.status(400).send(message)
}
}
let username = req.body.username;
let password = req.body.password;
User.findOne({username})
.then(user => {
if (user) {
const message = `username is already taken`
console.error(message)
return res.status(400).send(message)
}
else {
User.create({username, password})
.then(user => {
const userRes = {
id: user._id,
username: user.username
}
res.status(201).json(userRes)
}
)
}
})
.catch(err => {
console.error(err)
res.status(500).json({ error: 'something went horribly wrong'})
})
})
app.get('/login', (req, res) => {
const usernameReq = User.findById(req.body.username);
if (usernameReq) {
console.log(usernameReq)
res.status(201).json(usernameReq)
}
})
schema.js
const UserSchema = new mongoose.Schema({
username: {
type: String,
unique: true,
required: true,
trim: true
},
password: {
type: String,
required: true,
}
});
const User = mongoose.model('User', UserSchema);
module.exports = User;
Я ожидаю, что если я зарегистрируюсь с помощью «ninja» в качестве имени пользователя, я смогу зарегистрироваться, поскольку это действительное имя пользователя Fortnite. Фактический результат в настоящее время позволяет пользователям регистрироваться с любым именем пользователя, которого еще нет в базе данных.
Комментарии:
1. В чем, по-видимому, проблема? Вы можете легко добавить код для выполнения вызова API API tracker из обработчика вашего register API и, если он действителен, продолжить регистрацию, иначе отправьте ответ, в котором говорится, что это недопустимое имя пользователя.
2. как мне это сделать? Я не уверен, куда его поместить
3. сразу после выполнения базовой проверки полей и перед регистрацией в базе данных с помощью
User.findOne()
Ответ №1:
axios
Для выполнения внешнего вызова api вам понадобятся пакеты, такие как , request
, request-promise
( Promise
поддерживаемая версия request
) и т.д. Вы можете попробовать реализовать register
подобное.
const rp = require('request-promise');
app.post('/register', jsonParser, async (req, res) => {
...
let username = req.body.username;
let password = req.body.password;
const options = {
method : 'GET',
uri: 'https://api.fortnitetracker.com/v1/profile/{platform}/{epic-nickname}',
resolveWithFullResponse: true
}
const data = await rp(options)
// check if response code is 200 and check for the expected body
...
// continue rest of the code
}
Или используйте другое промежуточное программное обеспечение для вызова внешней конечной точки и выполнения таких проверок, как:
async function checkUser (req, res, next) {
const options = {
method : 'GET',
uri: 'https://api.fortnitetracker.com/v1/profile/{platform}/{epic-nickname}',
resolveWithFullResponse: true
}
const data = await rp(options)
// check if response code is 200 and check for the expected body
if (checks ok)
// if all check ok go to next middleware
next()
else
// if checks did not succeed
// you could pass error to error handler like next(new Error("Hey you do not exist"))
// or render something here
}
Затем смонтируйте его следующим образом:
app.post('/register', jsonParser, checkUser, (req, res) {
...
Ответ №2:
Вы можете сделать это, просто отправив имя пользователя в API https://api.fortnitetracker.com/v1/profile /{платформа}/{эпический ник}
Он выдаст вам ответ с упоминанием о том, существует пользователь или нет. На основе ответа вы можете сделать другой запрос AJAX для регистрации пользователя, только если пользователь не существует.
Ответ №3:
Я использую запрос обещания для разрешения, отклонения, когда кто-то вводит свое имя пользователя. Он вызывается только onClick . в вашем запросе вы сможете определить, был ли вызов успешным или нет с именем пользователя.