मैं Node.js ऐप के साथ SAP सिस्टम से डेटा प्राप्त करने का प्रयास कर रहा हूं।

कृपया सलाह दें कि मेरे कोड में async/await कहां रखें या शायद अलग दृष्टिकोण का उपयोग करें?

मैंने विभिन्न तरीकों का गुच्छा करने की कोशिश की है, लेकिन अभी भी आह्वान करने के लिए कनेक्ट होने की प्रतीक्षा नहीं करता है :(

var express = require('express');
var router = express.Router();
var rfc = require('node-rfc')

const client = new rfc.Client({
        'user': 'us3rname',
        'passwd': 'passw0rd',
        'ashost': 'h0st',
        'sysnr': '00',
        'client': '001'
})


router.get('/', function(req, res, next) {
        client.connect(err => err ? (console.log(err)) : (console.log('Connection successful')))

        client.invoke('RFC_READ_TABLE', {QUERY_TABLE: 'USR01', DELIMITER: '|'}, (err, res) => {
                if (err) return console.log(err)
                console.log(res)
        })

        res.render('index');
});

module.exports = router;
Error: Client invoked RFC call with closed connection: id=1
    at Client.invoke (/root/solo/node_modules/node-rfc/lib/wrapper/sapnwrfc-client.js:146:23)
    at /root/solo/routes/index.js:19:9
    at Layer.handle [as handle_request] (/root/solo/node_modules/express/lib/router/layer.js:95:5)
    at next (/root/solo/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/root/solo/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/root/solo/node_modules/express/lib/router/layer.js:95:5)
    at /root/solo/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/root/solo/node_modules/express/lib/router/index.js:335:12)
    at next (/root/solo/node_modules/express/lib/router/index.js:275:10)
    at Function.handle (/root/solo/node_modules/express/lib/router/index.js:174:3)
    at router (/root/solo/node_modules/express/lib/router/index.js:47:12)
    at Layer.handle [as handle_request] (/root/solo/node_modules/express/lib/router/layer.js:95:5)
    at trim_prefix (/root/solo/node_modules/express/lib/router/index.js:317:13)
    at /root/solo/node_modules/express/lib/router/index.js:284:7
    at Function.process_params (/root/solo/node_modules/express/lib/router/index.js:335:12)
    at next (/root/solo/node_modules/express/lib/router/index.js:275:10)
1
Yrk 19 अप्रैल 2020, 01:42

1 उत्तर

सबसे बढ़िया उत्तर

आप invoke को बहुत जल्दी कॉल कर रहे हैं, जब क्लाइंट अभी तक कनेक्ट नहीं हुआ है। आप जिस फ़ंक्शन client.connect का उपयोग कर रहे हैं, वह कॉलबैक को एक पैरामीटर के रूप में स्वीकार करता है, यानी एक फ़ंक्शन जिसे कनेक्शन स्थापित होने या विफल होने पर लागू किया जाता है। जिसका अर्थ है कि आपको उस फ़ंक्शन के अंदर RFC को निम्नानुसार लागू करना होगा:

router.get('/', function(req, res, next) {
    client.connect(err => {
        if (err) {
            return res.status(500).send(err);
        }
        client.invoke(
            'RFC_READ_TABLE',
            { QUERY_TABLE: 'USR01', DELIMITER: '|' },
            (err, result) => {
                if (err) {
                    return res.status(500).send(err);
                }
                res.send(result);
            }
        )
    });
});

या, यदि आप async/प्रतीक्षा पसंद करते हैं:

router.get('/', async function(req, res, next) {
    try {
        await client.open();
        let result = await client.call(
            'RFC_READ_TABLE',
            { QUERY_TABLE: 'USR01', DELIMITER: '|' }
        );
        res.send(result);
    } catch (err) {
        return res.status(500).send(err);
    }
});
1
Dan Karbayev 19 अप्रैल 2020, 12:32