Abhirock
Abhirock

Reputation: 445

issue while getting response as get result undefined

I am facing issue while getting response from one controller to other controller.

I trying to return response from my "ClientRegisterController.js" to "UserController.js", however I getting result as "undefined".

Please see below code for reference.

ClientRegisterController.js

async RegisterUser(Username, roleid, callback) {
    try {

        const setAsyncTimeout = (cb, timeout = 0) => new Promise(resolve => {
            setTimeout(() => {
                cb();
                resolve();
            }, timeout);
        });
        let query1 = {}
        query1.RoleId = roleid;
        //   query1.name = ''; 
        var name = '';
        // console.log('roleid', roleid)
        //console.log('Username',Username);
        var fs = require('fs');
        var obj = JSON.parse(fs.readFileSync('./config/Config.json', 'utf8'));

        const walletPath = path.join(process.cwd(), 'wallet');
        const wallet = new FileSystemWallet(walletPath);
        console.log(`Wallet path: ${walletPath}`);

        // Check to see if we've already enrolled the user.
        const userExists = await wallet.exists(Username);
        if (userExists) {
            response.data = null;
            response.httpstatus = 400;
            response.message = `An identity for the  ${Username} already exists in the wallet`;
            return response;
        }
        // console.log("Username1", Username)
        // Check to see if we've already enrolled the admin user.
        const adminExists = await wallet.exists(appAdmin);
        if (!adminExists) {

            response.data = null;
            response.httpstatus = 400;
            response.message = "Am admin identity is not registered . please register admin first";
            return response;
        }
        // console.log("Username2",Username)

        // Create a new gateway for connecting to our peer node.
        const gateway = new Gateway();
        await gateway.connect(ccp, {
            wallet,
            identity: appAdmin,
            discovery: {
                enabled: false,
                asLocalhost: true
            }
            /*** Uncomment lines below to disable commit listener on submit ****/
            // ,
            // eventHandlerOptions: {
            //     strategy: null
            // }
        });

        // Get the CA client object from the gateway for interacting with the CA.
        const ca = gateway.getClient().getCertificateAuthority();
        const adminIdentity = gateway.getCurrentIdentity();

        // console.log("Username4",Username)


        MongoClient.connect(config.Database.DFARM.connectString, function (err, client) {
                if (err) {

                    let connError = new Error(500, "Error connecting to DFARM database", err);
                    response.httpstatus = 500;
                    response.message =   "Error connecting to DFARM database :" + connError;                       
                    //  res.status(connError.status).json(connError);
                    return response;
                } else {

                    client.db(config.Database.DFARM.dbName).collection("Role").find(query1).toArray(function (err, docs) {
                        if (err) {
                            response.httpstatus = 500;
                            response.message =   "Error with DB :" + err;           
                            return response;
                            // need to return
                        } else {
                            // console.log('Role name DB', docs);
                             console.log('Role name DB',docs[0].name);
                            name = docs[0].name;
                            query1.name = name;

                            const doStuffAsync = async () => {
                                setAsyncTimeout(async () => {

                        const secret = await ca.register({
                            enrollmentID: Username,
                            role: 'client',
                            attrs: [{name: "approle",value: query1.name,ecert: true }]
                        }, adminIdentity);
                        console.log('secret', secret);   // return secret;                            

                        const enrollment = await ca.enroll({
                            enrollmentID: Username,enrollmentSecret: secret
                        });
                        // console.log('enrollment', enrollment);
                        const userIdentity = X509WalletMixin.createIdentity('DfarmadminMSP', enrollment.certificate, enrollment.key.toBytes());
                        // console.log("userIdentity", userIdentity)
                        await wallet.import(Username, userIdentity);
                        console.log(`Successfully  enrolled  user ${Username}  and imported it into the wallet`);
                        response.secret = secret;
                        // return response;
                        response.data = userIdentity
                        response.httpstatus = 200;
                        response.message = `Successfully registered admin user ${Username} and imported it into the wallet`;
                        console.log('result before', response);// result come here 
                        return callback(response); // response not return properly or not getting properly in "UserController.js"

                    }, 4000);
                }                
                 doStuffAsync();
                        }
                        client.close(); 
                    })
                }
            })   
    } catch (error) {
        response.error = error;
        response.httpstatus = 500;
        response.message = "Failed to enroll admin due to above error";
        return response;
    }
};

"UserController.js"

   clientregister.RegisterUser(VZID, roleid, next).delay(8000).then((result) => {
     console.log("data result", result)// result getting undefined.as not getting res from "ClientRegisterController.js".
    })

I have spent lots time to find the result with all things like callback and async/await still getting undefined so anybody please help me to find out the issue why I get result undefined.

Thanks in Advance

Upvotes: 0

Views: 208

Answers (1)

Holli
Holli

Reputation: 5082

Quickfix: Just give the function a proper callback.

clientregister.RegisterUser(VZID, roleid, (response) => 
{
  console.log(response);
});

But this is a weird function. It looks as if someone took synchronous code and badly slapped an async patch on it. You see, the function is async its return value will always be a Promise. Wherever the code uses return the return values won't go anywhere. What the code should do is call resolve, instead of return.

Also, that timeout construct is broken.

Edit: Actually, return values from async functions do go somewhere. They are implicitly resolved. Consider

function resolveAfter2Seconds() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve("resolved");
    }, 2000);
  });
}

async function asyncCall() {
  console.log('calling');
  var result = await resolveAfter2Seconds();
  return "RETURN " + result;
}

console.log( asyncCall().then( (r) => { console.log(r) } ) );


> "calling"
> [object Promise]
> "resolved"
> "RETURN resolved"

So, that isn't the problem.

Upvotes: 1

Related Questions