How can I improve error handling on a pool

孤街醉人 提交于 2021-01-29 18:45:37

问题


I am have created a class User that will hold the logic for inserting a new user into a postresql database. My code works perfectly but i think it is poorly written and would like some views on how to improve it, especially error handling.

const pool = require('../config/config.js');
// user constructor
class User {
  constructor(user) {
    this.username = user.username;
    this.email = user.email;
    this.password = user.password;
    this.role = user.role;
  }

  // save new user in databes
  createUser(res) {
    pool.connect((err, client, done) => {
      done();
      if (err) return res.status(400).json({ err });
      client.query('INSERT INTO users (username, email, password, role) VALUES($1, $2, $3, $4)', [this.username, this.email, this.password, this.role], (error) => {
        if (error) return res.json({ error });
        return res.json({ message: 'created successfully' });
      });
    });
  }
}

module.exports = User;

app.post('/', (req, res) => {
  const user = new User({
    username: 'Femoz',
    password: '1234',
    role: 'admin',
    email: 'femoz@gmail.com',
  });
  user.createUser(res);
  // res.json('user created successfully');
});

回答1:


const pool = require('../config/config.js');

class User {
  constructor(user) {
    this.username = user.username;
    this.email = user.email;
    this.password = user.password;
    this.role = user.role;
  }

  // save new user in databes
  save(cb) {
    const user = this;

    // Perhaps, you should to do some checks of props e.g. a name is not empty
    if (!user.name)
      return cb(Error('Empty name'));

    // I think that you should implement some wrapper 
    // e.g. `db.run` to avoid call the pool directly each time. 
    pool.connect((err, client, done) => {
      // done(); here is an error. You released the db-connection too early.
      if (err) 
         return cb(err);

      // I assumed that the result of done() is undefined so cb will be called.
      // Overwise use `&&` instead `||`.
      client.query(
        'INSERT INTO users (username, email, password, role) VALUES($1, $2, $3, $4) RETURNING id', 
        [user.username, user.email, user.password, user.role], 
        (err, res) => done() || cb(err, id: res && res.rows[0].id)
      );
    });
  }
}

module.exports = User;

app.post('/', (req, res, next) => {
  const user = new User({
    username: 'Femoz',
    password: '1234',
    role: 'admin',
    email: 'femoz@gmail.com',
  });

  // Return new id is better than a static text :)
  user.save((err, id) => err ? res.status(400).json({error: err.message}) : res.json({id}));

  // OR

  // For Express you can pass error to an error handler
  user.save((err, id) => err ? next(err) : res.json({id}));
});


来源:https://stackoverflow.com/questions/58831423/how-can-i-improve-error-handling-on-a-pool

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!