Невозможно вызвать запрос через сервер, пока код работает самостоятельно - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь написать приложение 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 Я также вижу эти сообщения, но затем журналы продолжаются, и транзакция заканчивается данными запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...