slxvxBatih
slxvxBatih

Reputation: 95

extract data from html table to nodejs post request

I fill html table with data from database (user's emails and their roles in my system (admins and users)).

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});
    });
});

With the help of ejs it looks next (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>

If I want to change some user's role I need to extract the data from table to JSON format for example in post request, how can I do this?
I tried to use request and 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');
});

but they works with new /adminOffice page and with initial values there.
For example there're 2 users in my table: {email: user1@user, role: user}, {email: user2@user, role: user}, I change role of 1st user to admin and press sumbit, request loads new adminOffice page where 1st user again has role user so post logs double not success and DB never changed.
Maybe I should use AJAX or smth else (new to NodeJS and JS)

Upvotes: 0

Views: 3234

Answers (1)

slxvxBatih
slxvxBatih

Reputation: 95

Changed html code:

 <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>

so I can easy now extract roles and work with them further

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');
});

Upvotes: 1

Related Questions