javascript - 在获得响应时出现问题,因为获取结果未定义
问题描述
我在从一个控制器到另一个控制器的响应时遇到问题。
我试图从我的“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".
})
我花了很多时间来找到结果,所有的事情,比如回调和异步/等待仍然未定义,所以请任何人帮助我找出为什么我得到未定义结果的问题。
提前致谢
解决方案
快速修复:只需给函数一个适当的回调。
clientregister.RegisterUser(VZID, roleid, (response) =>
{
console.log(response);
});
但这是一个奇怪的功能。看起来好像有人拿了同步代码并在上面打了一个异步补丁。你看,函数是async
它的返回值永远是 a Promise
。无论代码在哪里使用return
返回值都不会去任何地方。代码应该做的是调用resolve
,而不是返回。
此外,该超时构造已损坏。
编辑:实际上,async
函数的返回值确实在某个地方。它们是隐含的resolve
d。考虑
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"
所以,这不是问题。
推荐阅读
- python - 从现有的分隔列名创建多索引 DataFrame
- calculated-columns - 如何在 Spotfire 中的几个月之间捕获新用户/不同用户的列表
- express - 有没有办法在 Nestjs 应用程序中实现 CASAuthentication?
- python - 将字符串转换为数组列表
- amazon-web-services - AWS Cognito 代码示例——检查应用程序 ID
- javascript - 浏览器中的 mssql 引用错误,但代码可从终端(node.js、javascript、mssql)运行
- r - 如何在R中字符串的某个位置之后添加双引号
- amazon-web-services - Cloudfront Distribution S3 日志记录不起作用
- objective-c - 通过比较文件大小确定 NSProgressIndicator (Bar) 增量
- audio - 背景音频不适用于 Safari“添加到主屏幕”