【问题标题】:issue while getting response as get result undefined获取响应时出现问题,因为获取结果未定义
【发布时间】:2019-09-03 04:24:20
【问题描述】:

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

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

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

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;
    }
};

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

我花了很多时间来查找结果,但回调和异步/等待等所有内容仍然未定义,所以请任何人帮助我找出导致结果未定义的问题。

提前致谢

【问题讨论】:

  • 我猜delay(8000) 返回undefined
  • 我也立即尝试(8000),仍然遇到同样的问题

标签: javascript node.js


【解决方案1】:

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

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

但这是一个奇怪的功能。看起来好像有人采用了同步代码并在其上严重打了一个异步补丁。你看,函数是async,它的返回值总是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"

所以,这不是问题。

【讨论】:

  • 哇@Holli 这对我来说是一个令人大开眼界的答案,无论它在这种情况下是否有效,但它改变了我对异步/等待的想法,这对我来说非常重要。非常感谢。
  • 您的代码中似乎有多个未定义的变量,并且存在很多普遍的混淆。你应该养成用更短的功能单元编写代码的习惯。如果一个函数不能完整地显示在屏幕上,那么它就太长了。考虑一下pastebin.com/NpcQV7Sa,我试图这样做。
  • 感谢@Holli 为理解这一切所做的一切努力。真的我现在获得了很多,我将来会在我的代码中实现这样的功能,同时优化我的代码并使其异步。
猜你喜欢
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多