如何使用UUID和Postgres pg-promise库创建ExpressJS Restful API

问题描述 投票:0回答:1

我正在尝试在我的Web应用程序中为用户创建CRUD。我正在使用uuid作为我的ID(也是主键,如下面的用户表所示)。我正在使用pg-promise库连接到Postgres。用于创建用户并使所有用户正常工作的Route代码。但是我在创建用于获取一个用户,删除用户或更新用户的id const时如何引用uuid方面遇到了挑战const user_id = parseInt(req.params.id);

请参阅下面的示例代码。我也会感谢任何带有示例的在线资源。

我的用户表

CREATE TABLE m_user (
id uuid DEFAULT uuid_generate_v4() NOT NULL,
username text NOT NULL UNIQUE,
password text NOT NULL,
confirm_password text NOT NULL,
created_at timestamp NOT NULL default now(),
last_login timestamp NOT NULL default now(),
PRIMARY KEY (id)
);

欺诈获得一位用户

function getSingleUser(req, res, next) {
  const showoneuserquery = 'SELECT * FROM user where id = $1'
  const user_id = parseInt(req.params.id);
  db.one(showoneuserquery, user_id)
    .then(function (data) {
      res.status(200)
        .json({
          status: 'success',
          data: data,
          message: 'Retrieved ONE user'
        });
    })

    .catch(function (err) {
      return next(err);
    });
}

编辑用户密码

function editUser(req, res, next) {
  const edituserquery = 'update user set username=$1, password=$2, confirm_password=$3  where id=$4'
  db.none(edituserquery, [req.body.username, req.body.password, req.body.confirm_password, (req.params.id)])
    .then(function () {
      res.status(200)
        .json({
          status: 'success',
          message: 'Updated user'
        });
    })
    .catch(function (err) {
      return next(err);
    });
}
node.js postgresql uuid
1个回答
0
投票

[确定一些关于UUID的注释。 @vitaly_t不太正确的uuid不仅仅是字符串。虽然在视觉上它们以字符串形式显示,但是您可以将它们作为字符串进行处理,它们是很好的UUID。具有唯一属性的字符串最缺乏特色的是several representations格式。在一个小演示下面显示了这一点。字符串无法执行此功能。

create table uuid_demo(uuid_col uuid,  description text);

-- insert a generated systen function generated uuid
-- requires pgcrypto extension
insert into uuid_demo(uuid_col, description)
     values (gen_random_uuid(),'Systen Generated uuid') ;

-- show generated
select * from uuid_demo;
/*
uuid_col                            ;description
d41c9d09-0e21-4acf-b82c-41f009c84aeb;Systen Generated uuid
*/

-- query demo with generated uuid, both with and without formatting
select uuid_demo.*,'#1. Standard Form'  note       from uuid_demo where uuid_col = 'd41c9d09-0e21-4acf-b82c-41f009c84aeb'
union all
select uuid_demo.*,'#2. Standard, cast'            from uuid_demo where uuid_col = 'd41c9d09-0e21-4acf-b82c-41f009c84aeb'::uuid
union all
select uuid_demo.*,'#3 Non Standard Upper case'    from uuid_demo where uuid_col = 'D41C9D09-0E21-4ACF-B82C-41F009C84AEB'
union all
select uuid_demo.*,'#4 Non Standard Unformatted'   from uuid_demo where uuid_col = 'd41c9d090e214acfb82c41f009c84aeb'
union all
select uuid_demo.*,'#5 Non Std. Upper Unformatted' from uuid_demo where uuid_col = 'D41C9D090E214ACFB82C41F009C84AEB'
union all
select uuid_demo.*,'#7 Non Standard bracket'       from uuid_demo where uuid_col = '{d41c9d090e214acfb82c41f009c84aeb}';

/*
uuid_col                            ;description          ;note
d41c9d09-0e21-4acf-b82c-41f009c84aeb;Systen Generated uuid;#1. Standard Form
d41c9d09-0e21-4acf-b82c-41f009c84aeb;Systen Generated uuid;#2. Standard, cast
d41c9d09-0e21-4acf-b82c-41f009c84aeb;Systen Generated uuid;#3. Non Standard Upper case
d41c9d09-0e21-4acf-b82c-41f009c84aeb;Systen Generated uuid;#4. Non Standard Unformatted
d41c9d09-0e21-4acf-b82c-41f009c84aeb;Systen Generated uuid;#5. Non Std. Upper Unformatted
d41c9d09-0e21-4acf-b82c-41f009c84aeb;Systen Generated uuid;#6. Non Standard bracket

现在是直接问题:您应该如何引用。这里的vitaly_t是正确的,因为在您的代码中只需将其作为字符串处理即可。

  1. 尝试使用(#1)的标准。这就是Postgres将始终提供的输出形式。
  2. 尝试使用Postgres强制转换运算符(::)(#2)。
  3. 尝试使用Postgres CAST指令(上面未显示)。>>
  4. 我将尝试将它们全部转换成ExpressJS格式。但我不能保证(我只是复制并修改了您的帖子)。再次查看我之前的免责声明。

  1. const showoneuserquery ='SELECT * FROM用户,其中id = $ 1'
  2. const showoneuserquery ='SELECT * FROM用户,其中id = $ 1 :: uuid'
  3. const showoneuserquery ='选择*来自用户,其中id = CAST($ 1作为UUID)'
  4. 对于更新,删除操作遵循相同的格式。

如果这些都不起作用,您还有其他选择。由于您对用户名有唯一的约束,只需使用它来访问用户表,然后在加入用户表时仅使用UUID,该用户名应为UUID列名至UUID列名。没什么特别的。

© www.soinside.com 2019 - 2024. All rights reserved.