首页 > 解决方案 > 在获得响应时出现问题,因为获取结果未定义

问题描述

我在从一个控制器到另一个控制器的响应时遇到问题。

我试图从我的“ClientRegisterController.js”返回响应到“UserController.js”,但是我得到的结果是“未定义”。

请参阅下面的代码以供参考。

客户端注册控制器.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;
    }
};

“用户控制器.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".
    })

我花了很多时间来找到结果,所有的事情,比如回调和异步/等待仍然未定义,所以请任何人帮助我找出为什么我得到未定义结果的问题。

提前致谢

标签: javascriptnode.js

解决方案


快速修复:只需给函数一个适当的回调。

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

但这是一个奇怪的功能。看起来好像有人拿了同步代码并在上面打了一个异步补丁。你看,函数是async它的返回值永远是 a Promise。无论代码在哪里使用return返回值都不会去任何地方。代码应该做的是调用resolve,而不是返回。

此外,该超时构造已损坏。

编辑:实际上,async函数的返回值确实在某个地方。它们是隐含的resolved。考虑

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"

所以,这不是问题。


推荐阅读