Я пытаюсь написать приложение nodejs для фабрики гиперледжеров, используя nodejs SDK. Чтобы сделать первый шаг, я решил просто создать функцию, которая запрашивает информацию из книги. Я ожидаю, что это будет работать, но вместо этого я получаю сообщение об ошибке: Failed to evaluate transaction: TypeError: CKS(...).then is not a function
У меня есть файл query.js, который отлично работает, если я просто вызываю его из терминала node query.js
.
'use strict';
const { FileSystemWallet, Gateway } = require('fabric-network');
const path = require('path');
const util = require('util');
const fs = require('fs');
const walletPath = path.join(__dirname, 'wallet');
const wallet = new FileSystemWallet(walletPath);
const ccpPath = path.resolve(__dirname, '..', 'fabric-network', 'connection-org1.json');
const ccpFile = fs.readFileSync(ccpPath);
const ccp = JSON.parse(ccpFile.toString());
const log4js = require('log4js');
const logger = log4js.getLogger('Helper');
logger.level = 'DEBUG';
const hfc = require('fabric-client');
hfc.setLogger(logger);
module.exports.queryUser = async function () {
try {
// Create a new file system based wallet for managing identities.
//const walletPath = path.join(process.cwd(), 'wallet');
console.log(`Wallet path: ${walletPath}`);
// Check to see if we've already enrolled the user.
const userExists = await wallet.exists('user1');
if (!userExists) {
console.log('An identity for the user "user1" does not exist in the wallet');
console.log('Run the registerUser.js application before retrying');
return;
}
// Create a new gateway for connecting to our peer node.
const gateway = new Gateway();
await gateway.connect(ccp, { wallet, identity: 'user1' });
// Get the network (channel) our contract is deployed to.
const network = await gateway.getNetwork('mychannel');
// Get the contract from the network.
const contract = network.getContract('smartconsent', 'Citizen');
//const contract = network.getContract('smartconsent', 'Researcher');
// Evaluate the specified transaction.
// queryCar transaction - requires 1 argument, ex: ('queryCar', 'CAR4')
const result = await contract.evaluateTransaction('queryCitizen', '1');
console.log(`Transaction has been evaluated, result is: ${result.toString()}`);
} catch (error) {
console.error(`Failed to evaluate transaction: ${error}`);
process.exit(1);
}
}
Возвращает мне гражданина, которого я зарегистрировал ранее. Таким образом, в главной книге блокчейна у меня есть гражданин.
Также у меня есть сервер на локальном хосте: 4000. Это мой app.js
'use strict';
var log4js = require('log4js');
var logger = log4js.getLogger('SampleWebApp');
var express = require('express');
var bodyParser = require('body-parser');
var http = require('http');
var util = require('util');
var app = express();
var expressJWT = require('express-jwt');
var jwt = require('jsonwebtoken');
var bearerToken = require('express-bearer-token');
var cors = require('cors');
var host = 'localhost';
var port = '4000';
const query = require('./javascript/query.js');
require('./config.js');
var hfc = require('fabric-client');
app.options('*', cors());
app.use(cors());
//support parsing of application/json type post data
app.use(bodyParser.json());
//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: false }));
// set secret variable
app.set('secret', 'thisismysecret');
app.use(expressJWT({
secret: 'thisismysecret'
}).unless({
path: ['/users']
}));
app.use(bearerToken());
/////VERIFY//////
app.use(function (req, res, next) {
logger.debug(' ------>>>>>> new request for %s', req.originalUrl);
if (req.originalUrl.indexOf('/users') >= 0) {
return next();
}
var token = req.token;
jwt.verify(token, app.get('secret'), function (err, decoded) {
if (err) {
res.send({
success: false,
message: 'Failed to authenticate token. Make sure to include the ' +
'token returned from /users call in the authorization header ' +
' as a Bearer token'
});
return;
} else {
// add the decoded user name and org name to the request object
// for the downstream code to use
req.username = decoded.username;
req.orgname = decoded.orgName;
logger.debug(util.format('Decoded from JWT token: username - %s, orgname - %s', decoded.username, decoded.orgName));
return next();
}
});
});
///////////////////////////////////////////////////////////////////////////////
//////////////////////////////// START SERVER /////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
var server = http.createServer(app).listen(port, function () { });
logger.info('****************** SERVER STARTED ************************');
logger.info('*************** http://%s:%s ******************', host, port);
server.timeout = 240000;
function getErrorMessage(field) {
var response = {
success: false,
message: field + ' field is missing or Invalid in the request'
};
return response;
}
app.get('/users', async function (req, res) {
logger.debug('================ GET RESEARCHER ======================');
let message = await query.queryUser();
res.send(message);
});
Когда я звоню GET http://localhost:4000/users, он звонит query.queryUser()
.
Я ожидаю, что это будет работать так, как работает, когда я вызываю узел query.js
Но вместо этого я получаю сообщение об ошибке: Failed to evaluate transaction: TypeError: CKS(...).then is not a function
Я повернулсяклиентского регистратора и ошибка появляется после следующих сообщений:
[2019-10-03T14:56:14.657] [DEBUG] Helper - [utils.CryptoKeyStore]: This class requires a CryptoKeyStore to save keys, using the store: {"opts":{"path":"/Users/Purka/Documents/projects/smartconsent-api/nodejs-sdk-app/javascript/wallet/user1"}}
[2019-10-03T14:56:14.658] [DEBUG] Helper - [FileKeyValueStore.js]: constructor { options:
{ path: '/Users/Purka/Documents/projects/smartconsent-api/nodejs-sdk-app/javascript/wallet/user1' } }
Я дважды проверил, у меня есть кошелек и пользователь в этом пути.
Когда я вызываю только узелquery.js Я также вижу эти сообщения, но затем журналы продолжаются, и транзакция заканчивается данными запроса.