извлекать данные из таблицы html в почтовый запрос nodejs

Я заполняю html-таблицу данными из базы данных (электронные письма пользователей и их роли в моей системе (админы и пользователи)).

router.get('/adminOffice', function(req, res){
    database.connection.query("select email, role from users", function(err, rows, fields){
        if(err) console.log(err);
        res.render('adminOffice', {rows: rows});
    });
});

С помощью ejs это выглядит следующим образом (adminOffice.ejs):

<form method="post" action="saveRoles">
    <table name="table" id="table"><tr>
        <th>Email</th><th>Role</th>
    </tr>
    <% for (var i = 1; i < rows.length; i++) { %>
    <tr class="tableclass">
        <td><%= rows[i].email %></td>
        <td> <select class="select">
            <% if (rows[i].role == 'admin') { %>
            <option selected value="admin">admin</option>
            <option value='user'>user</option>
            <% } else { %>
            <option selected value="user">user</option>
            <option value="admin">admin</option>
            <% } %>
        </select>
    </tr>
    <% } %>
</table>
    <input type="submit" name="submit" value="submit" />
</form>

Если я хочу изменить какую-то роль пользователя, мне нужно извлечь данные из таблицы в формат JSON, например, в почтовом запросе, как я могу это сделать?
Я пытался использовать request и cheerio

router.post('/saveRoles', function(req, res, next){
    request.get('http://127.0.0.1:3000/adminOffice', function(err, 
        response, body, callback){
        var $ = cheerio.load(body);
        var result = $(".tableclass").map((i, element) => ({
        email: $(element).find('td:nth-of-type(1)').text(),
        role: $(element).find('.select option:selected').text()
    })).get();

    console.log(result[0].role);

    database.connection.query("select email, role from users", function(err, rows, fields){
        if(err) console.log(err);
        for(var i = 1; i < rows.length; i++){
            if(rows[i].role != result[i-1].role){
                database.connection.query("update users set role = ? where email = ?", rows[i].role, rows[i].email, function(err, res){
                    if(err) console.log(err);
                    console.log("success");
                });
            } else {
                console.log("not success");
            }
        }
    });
    }); 


    res.redirect('/adminOffice');
});

но они работают с новой /adminOffice страницей и с начальными значениями там.
Например, в моей таблице есть 2 пользователя: {email: user1@user, role: user}, {email: user2@user, role: user}, я меняю роль 1-го пользователя на admin и нажимаю sumbit, request загружает новую adminOffice страницу, где снова 1-й пользователь имеет роль user, поэтому post регистрирует двойное not success, а БД никогда не менялась.
Может быть, мне следует использовать AJAX или что-то еще (новое для NodeJS и JS)


person slxvxBatih    schedule 13.07.2018    source источник


Ответы (1)


Изменен html-код:

 <form method="post" action="/saveRoles">
        <% for (var i = 1; i < rows.length; i++) { %>
        <div class="form-group">
            <label for="changingRole"> <%= rows[i].email %></label>
            <select name="role">
                <% if (rows[i].role == 'admin') { %>
                <option selected value='admin'>admin</option>
                <option value="user">user</option>
                <% } else { %>
                <option selected value="user">user</option>
                <option value="admin">admin</option>
                <% } %>
            </select>
        </div>
        <% } %>
        <button type="submit" class="btn btn-primary">Submit</button>
    </form>

так что теперь я могу легко извлекать роли и работать с ними дальше

router.post('/saveRoles', urlencodedParser, function(req, res, next){
    var roles = req.body;

    database.connection.query("select email, role from users", function(err, rows, fields){
        if(err) console.log(err);
        for(var i = 1; i < rows.length; i++){
            console.log(rows[i].role);
            console.log(roles.role[i-1]);
            if(rows[i].role != roles.role[i-1]){
                database.connection.query("update users set role = ? where email = ?", [roles.role[i-1], rows[i].email], 
                    function(err, res){
                        if(err) console.log(err);
                        console.log("success");
                    });
            } else {
                console.log("not changed");
            }
        }
    });
    res.redirect('/adminOffice');
});
person slxvxBatih    schedule 13.07.2018