javascript - 为什么Koa ctx.body在if语句中不起作用?

标签 javascript node.js postgresql koa koa-router

我正在尝试在带有koa和postgresql的节点中创建post RestApi。我有一个唯一的电子邮件验证,并且想检查电子邮件是否存在,它应该显示该邮件已经存在的消息用户。我的查询正在工作,但是ctx.body无法工作。该API每次都会创建新用户。当数据库中存在电子邮件时,应显示msg“该电子邮件已存在用户”。为什么我的ctx.body无法正常工作?希望你能理解。

router.post('/createNewUser', async (ctx) => {

    var name = ctx.request.body.name;
    var email = ctx.request.body.email;
    var password = ctx.request.body.password;

    if (
        !name ||
        !email ||
        !password
    ) {
        ctx.response.status = 400;
        ctx.body = {
            status: 'error',
            message: 'Please fill all the fields'
        }
    } else {

        await ctx.app.pool.query("SELECT * FROM users WHERE email = $1",
                [`${email}`],
            (err, result) => {
            if(result.rows.length > 0){
                ctx.body = {
                    exceptions: "",
                    status: 200,
                    error: false,
                    message: "user already exists with this email",
                };
            }
        });

        await ctx.app.pool.query(`INSERT INTO USERS (name,email,password) VALUES ('${name}','${email}','${bcrypt.hashSync(password, 10)}')`);
        const {rows} = await ctx.app.pool.query("SELECT * FROM users ORDER BY id DESC LIMIT 1");

        ctx.body = {
            exceptions: "",
            status: 200,
            error: false,
            message: "User registered Successfully",
            data: rows[0],
        };
    }
});

最佳答案

在这种特殊情况下,电子邮件唯一性检查后功能执行不会完成。设置ctx.body不会从中间件返回。因此,它设置ctx.body,然后继续进行用户创建步骤。我的建议是根据错误处理模式重构代码(更多信息可以在https://github.com/koajs/koa/wiki/Error-Handling中找到)。

更新:

或者只是将用户创建步骤移至电子邮件唯一性检查,如下所示:

router.post("/createNewUser", async ctx => {
  var name = ctx.request.body.name;
  var email = ctx.request.body.email;
  var password = ctx.request.body.password;

  if (!name || !email || !password) {
    ctx.response.status = 400;
    ctx.body = {
      status: "error",
      message: "Please fill all the fields"
    };
  } else {
    const { rows } = await ctx.app.pool.query("SELECT * FROM users WHERE email = $1", [`${email}`]);

    if (rows.length > 0) {
      ctx.body = {
        exceptions: "",
        status: 200,
        error: false,
        message: "user already exists with this email"
      };
    } else {
      await ctx.app.pool.query(`INSERT INTO USERS (name,email,password) VALUES('${name}','${email}','${bcrypt.hashSync(password, 10)}')`);
      const { rows } = await ctx.app.pool.query("SELECT * FROM users ORDER BY id DESC LIMIT 1");

      ctx.body = {
        exceptions: "",
        status: 200,
        error: false,
        message: "User registered Successfully",
        data: rows[0]
      };
    }
  }
});

关于javascript - 为什么Koa ctx.body在if语句中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59399150/

相关文章:

javascript - 同一网络 Assets ID 被跟踪两次 - Google Analytics

javascript - 从 event.target 获取子元素

node.js - Sails.js Same Model 多对多关联

javascript - 在 Iron Router 中使用布局时向 <head> 添加行

postgresql - Postgres : narrowing trigger scope

javascript - 将具有两个属性的对象分组到表中

node.js - 安装 Karma (Testacular) 时出错

postgresql - Postgres 100% CPU。高写/读操作计数率

postgresql - 一起使用 postgresql UNIQUE INDEX 和 FUNCTIONAL INDEX

javascript - 如何在 2 个图标之间切换