从html表中提取数据到nodejs发布请求

时间:2018-07-13 11:54:43

标签: node.js post request ejs cheerio

我用数据库中的数据(用户的电子邮件及其在系统中的角色(管理员和用户))填充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格式,例如在后期请求中,该怎么做?
我尝试使用requestcheerio

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},我将第一个用户的角色更改为admin,然后按sumbitrequest会加载新的adminOffice页第一位用户再次具有角色user,因此post记录了两次not success,并且DB从未更改。
也许我应该使用AJAX或其他(NodeJS和JS的新功能)

1 个答案:

答案 0 :(得分:0)

更改的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');
});
相关问题