Reputation: 445
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
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 resolve
d. 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