Search code examples
javascriptoracle-databaseexpressnode-oracledb

Cannot read property "rid" of undefined


[TypeError: Cannot read property 'rid' of undefined]

Is the error that I get when I try to execute this controller on my post route. I've tested it out with Postman.

I've tried to console.log(result) but I get undefined.

My query gets executed and my row is inserted into my table. I've checked it. Password is also hashed.

The problem is that I don't get any out binds that should be returned.

Problematic code (IMO) is

  ...
  .then(function(result) {
    console.log(result);
    cb(null, {
      id: result.outBinds.rid[0],
      email: result.outBinds.remail[0],
      role: result.outBinds.rrole[0]
    });
  })
  ...

oracle-NodeDB Wrapper

var oracledb = require('oracledb');

module.exports.OBJECT = oracledb.OBJECT;

function executeSQL(config ,sql, bindParams , options) {
  return new Promise(function(resolve, reject) {
    oracledb.getConnection(
      config,
      function(err, connection) {
        if (err) {
          return reject(err);
        }
        connection.execute(
          sql,
          bindParams,
          options,
          function(err, result) {
            if (err) {
              doRelease(connection);
              return reject(err);
            }
            resolve(result);
            doRelease(connection);
          });
      });
  });
}

function doRelease(connection) {
  connection.release(
    function(err) {
      if (err) {
        console.log(err.message);
      }
    }
  );
}

module.exports.executeSQL = executeSQL;

Controller

var database = require('../database/oracledbWrapper');
var dbconfig = require('../database/dbconfig').dbconfig;
var jwt = require('jsonwebtoken');
var bcrypt = require('bcrypt');

    exports.createUser = function(req, res, next) {
        var user = {
            email: req.body.email
        };

        var unhashedPassword = req.body.password;

        bcrypt.genSalt(10, function(err, salt) {
            if (err) {
                return next(err);
            }
            bcrypt.hash(unhashedPassword, salt, function(err, hash) {
                if (err) {
                    return next(err);
                }

                user.hashedPassword = hash;

                insertUser(user, function(err, user) {

                    var payload;

                    if (err) {
                        return next(err);
                    }

                    payload = {
                        sub: user.email,
                        role: user.role
                    };

                    res.status(200).json({
                        user: user,
                        token: jwt.sign(payload, config.jwtSecretKey, {expiresInMinutes: 60})
                    });
                });
            });
        });
    }

    function insertUser(user, cb) {

      var bindParams =  {
          email: user.email.toLowerCase(),
          password: user.hashedPassword,
          rid: {
            type: database.NUMBER,
            dir: database.BIND_OUT
          },
          remail: {
            type: database.STRING,
            dir: database.BIND_OUT
          },
          rrole: {
            type: database.STRING,
            dir: database.BIND_OUT
          }
        };

      database.executeSQL(
        dbconfig,
        'insert into express_users (email,  password, role ) values ( :email, :password,  \'BASE\' ) returning id, email, role into :rid , :remail, :rrole', 
        bindParams,
        {}
      )
      .then(function(result) {
        console.log(result);
        cb(null, {
          id: result.outBinds.rid[0],
          email: result.outBinds.remail[0],
          role: result.outBinds.rrole[0]
        });
      })
      .catch(function(err) {
        console.log(err);
        next(err);
      });
    }

Route

var RESTfulAPICon = require('../controllers/RESTfulAPI');
var indexCon = require('../controllers/index');
var views = require('express').Router();

views.route('/users').post(RESTfulAPICon.createUser);

exports.views = views;

Solution

  • The problem was in my wrapper , mainly here

    module.exports.OBJECT = oracledb.OBJECT;
    

    I export only the OBJECT property , but I try to access BIND_OUT properties later on. And they are non existent.

    If I do the full export like this

    module.exports.OBJECT = oracledb;
    

    Then I can access BIND_OUT properties.