Express.js上的GET请求正在从数据库中返回所有值

时间:2019-02-24 16:49:15

标签: javascript node.js http express

我正尝试通过使用 Form 在Express.js上使用GET方法返回一个特定用户的数据。但是,使用form时,它将返回所有值。

这是index.html代码:

<form action="http://localhost:1234/users" method="get">
   id <input type="number" name="id" placeholder="enter id" /><br/>
</form>

和app.js代码:

    app.get('/users/:id', (request, response) => {
    const id = request.params.id;

    pool.query(`SELECT * FROM users WHERE id = ${id}`, id, (error, result) => {
        if (error) throw error;

        response.send(result);
    });
});

基本上,当我通过url http://localhost:1234/users/1 发送请求时,仅显示指定用户的数据。但是,当我使用 form 发送数据时,我看到的主要问题是URL,现在该URL变成了 http://localhost:1234/users?id=1 。因此,它将从数据库返回所有值。我该如何解决?我知道也许这很容易,但是作为node.js和express的新手,我已经尝试了几种方法,但是从形式上讲它不起作用。

1 个答案:

答案 0 :(得分:0)

最自然的解决方案是使用Ajax在表单提交时发送查询,并禁用表单(<event>.preventDefault())的默认行为。

我将解决一种更hacky的方式,该方式不涉及修改客户端,而仅涉及服务器:

  1. 通过添加问号使:id为可选参数
  2. 处理两种情况:如果定义了req.params.id但未定义req.query.id,或者如果定义了req.query.id但未定义req.params.id

app.get('/users/:id?', (request, response) => {
    const paramId = request.params.id;
    const queryId = request.query.id;
    var id;

    if(paramId && !queryId)
        id = paramId;
    else if(queryId && !paramId)
        id = queryId;

    if(!id)
        return response.send('Please specify an id');

    pool.query(`SELECT * FROM users WHERE id = ${id}`, id, (error, result) => {
        if (error) throw error;

        response.send(result);
    });
});

有了这个,下面的URL就可以了:

  • http://localhost:1234/users/1
  • http://localhost:1234/users?id=1

不是:

  • http://localhost:1234/users/
  • http://localhost:1234/users/1?id=1