【问题标题】:How to launch a command on the server from a web page ( nodejs )如何从网页(nodejs)在服务器上启动命令
【发布时间】:2021-09-24 15:47:16
【问题描述】:

我认为我想要做的事情很简单,但我只是不知道使搜索效率更高的正确措辞。

我有一个 webapp,在 node js 中,带有 express.js 框架。 网页使用 EJS 进行模板化,并且我有一个包含我的数据 (MySQL) 的数据库。

当我加载一个页面时,我会得到一个对象中传递的所有项目的列表,并且我有一个 foreach 语句来生成一个表。

JS函数:

listParts: (req, res) => {
    
    let query = `SELECT parts.*, l.product_vehicleId as InstalledOn, v.name as VehicleName FROM parts
                LEFT JOIN current_loadout as l ON idpart=l.parts_idparts
                LEFT JOIN dataRef.product as v ON v.idvehicle=l.product_vehicleId
                WHERE idpart>0;`
    db.query(query, (err, qResult) =>{
        if ( err == null )
        {
            res.render('listParts.ejs', { 
                title: 'RPA parts list',
                partList: qResult,
                url: req.originalUrl
            })
        }
    });
}

EJS 部分:

     <tbody align="center">
                    <% partList.forEach((part, idx) => {%>
                        <tr>
                            <td><%=part.name%></td>
                            <td><%=part.serial%></td>
                            <td><%=Math.floor(part.ttsn/60).toFixed()%>:<%=Math.floor(Math.abs(part.ttsn%60)).toFixed(0).padStart(2,'0')%></td>
                            <td><%=part.maxTTSN%></td>
                            <td><%=part.maxCalendarDate%></td>
                            <td><%=part.VehicleName%></td>
                            <td><%if (part.serviceable) {%>
                                <a class="badge badge-success">Serviceable</a>
                                <%}else{%>
                                    <a class="badge badge-danger">Unserviceable</a>
                                <%}%>
                            </td>
                            <td><%if (part.serviceable) {%>
                                    <a href="11">  Make serviceable</a>
                                <%}else{%>
                                    <a href="11">  Make serviceable</a>
                                <%}%>
                            </td>
                        </tr>
                    <%})%>
                </tbody>

当用户单击按钮时,我想在服务器上进行调用以查询数据库以更改我的零件对象的状态。

通常我使用 REST API 端点的 href 来调用删除对象。

我的难题是:如何使其对用户隐藏,以便人们无法使用脚本调用 REST 端点并更改我所有部分的状态??

我的背景是 C 和 C++ Python ...我对 javascript 和所有 Node 模块都很陌生,尤其是,我是一个前端的菜鸟。

有人能指点我一个好的方向吗?

【问题讨论】:

    标签: html node.js express ejs


    【解决方案1】:

    俗话说,保护路线!

    现在,我们如何做到这一点,尤其是当来自未经身份验证的客户端请求的调用时?

    输入 JWT(JSON 网络令牌)比您想象的要容易。

    JWT 是在您的服务器上生成的令牌,可以包含任意数量的值,例如 appID、userID 等。这些令牌随后会被“编码”和“base64”,然后最终将其发送回用户。令牌是用密码编码的,所以如果有人试图修改令牌中的“有效负载”,它不会通过校验和,解码就会失败。

    那么这到底是什么意思?

    这意味着,您现在可以使用中间件在处理请求之前使用令牌身份验证来保护您的路由。如果令牌不匹配,则不会发生更新,您可以向客户端返回未经授权的响应。

    设置起来相当简单,您可以安装 JWT npm 包,这将允许您生成和解码令牌。在您的应用程序中,您将创建一个“getToken”端点。这将生成令牌以传回给用户(这通常在对应用程序进行身份验证时完成)

    然后将令牌发送回用户并存储在安全 cookie 中(您可以随意存储它,但安全 cookie 将确保令牌安全)

    当您向其他端点发出 POST 请求时,只需将令牌添加到标头或作为 post 值。

    在您的路由上,作为中间件或路由本身读取令牌,对其进行解码,如果没有错误,则令牌有效并处理请求,否则不要更新它。

    【讨论】:

    • 非常感谢这个完整的答案。截至目前,我正在使用一种非常糟糕的方法来验证用户身份验证,因为所有“登录”的用户都具有相同的权限if (editMode &amp;&amp; typeof req.user === 'undefined') { res.status(401).send("Error, not authorized") return } 所以,正如我所建议的那样,我将看看 JWT、Cookies、autentication。对于如何跨页面/选项卡获取持久数据,我仍然有点不知所措,但我认为这将是另一个需要讨论的话题。
    • 简短的回答,正如我所知道的那样:就我而言,让服务器做某事的最好方法是通过我将实现的 REST API(路由)。
    • 我还应该补充一点,如果这是一个 Web 应用程序或 PWAP,它将与节点位于同一台服务器上,您始终可以使用 EJS(模板库)和会话进行身份验证,因此无需点击API 作为响应返回到响应对象并通过 EJS 读取
    猜你喜欢
    • 2016-02-06
    • 2019-08-02
    • 2011-12-17
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    相关资源
    最近更新 更多