Search code examples
javascriptnode.jsexpresshapi.jsreply

What is the hapi equivalent of res.writehead and res.write?


I am using ccavenue npm module to integrate payment gateway in my website. The problem with that modules is that it uses res.write and res.writehead while the res variable passed to the module is generated by hapi and thus generating a error. So, what is the hapi equivalent of res.writehead and res.write.

Here is my hapi code:

var ccavenue = require('ccavenue');

ccavenue.setMerchant("******");
ccavenue.setWorkingKey("*******************");
ccavenue.setRedirectUrl("/redirect-url");


module.exports = function(plugin, options, next) {

    plugin.route({
        method: 'GET',
        path: '/checkout',
        handler: function(request, reply) {
            var param = {
                billing_cust_address: 'Bangalore',
                billing_cust_name: 'Nitish Kumar'
            };
        ccavenue.setOrderId("8981455644");
        ccavenue.setOrderAmount("1000");
        ccavenue.setOtherParams(param);
        ccavenue.makePayment(reply);
        }
    });

}

This is the module function:

function makePayment(res) {
    var errors = helper.checkRequiredField(config);
    if(errors.length > 0) {
        throw new Error(errors);    
    }

    var Checksum = helper.getCheckSum(config.merchantId, config.orderAmount, config.orderId, config.redirectUrl, config.workingKey); //This function is to verify 

    var body = "<form method='post' name='checkout' id='checkout' action='https://www.ccavenue.com/shopzone/cc_details.jsp'>" +
          "<input type=hidden name='Merchant_Id' value='" + config.merchantId + "'>" +
          "<input type=hidden name='Amount' value='" + config.orderAmount + "'>" +
          "<input type=hidden name='Order_Id' value='" + config.orderId + "'>" +
          "<input type=hidden name='Redirect_Url' value='" + config.redirectUrl +"'>" +
          "<input type=hidden name='Checksum' value='" + Checksum + "'>" +
          "<input type=hidden name='TxnType' value='A'>" +
          "<input type=hidden name='ActionID' value='TXN'>";

          for(var key in otherParams) {
                body += "<input type=hidden name='"+ key +"' value='" + otherParams[key] + "'>";
          }

          body += "</form><script type='text/javascript'>" +
              "document.getElementById('checkout').submit();" +
          "</script>";

    res.writeHead(200, {
        'Content-Length': Buffer.byteLength(body),
        'Content-Type': 'text/html'
    });

    res.write(body);
    res.end();
}

This is the error:

Debug: internal, implementation, error 
    TypeError: Uncaught error: res.writeHead is not a function
    at Object.makePayment (/home/satnam-sandhu/Workstation/cuboid.io/servers/web/node_modules/ccavenue/index.js:59:8)
    at Object.plugin.route.handler (/home/satnam-sandhu/Workstation/cuboid.io/servers/web/ccavenue/index.js:21:15)
    at Object.exports.execute.internals.prerequisites.internals.handler.finalize [as handler] (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/lib/handler.js:101:51)
    at /home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/lib/handler.js:32:23
    at internals.Protect.run.finish [as run] (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/lib/protect.js:60:12)
    at exports.execute.finalize (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/lib/handler.js:26:22)
    at each (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/lib/request.js:401:16)
    at iterate (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/node_modules/items/lib/index.js:36:13)
    at done (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/node_modules/items/lib/index.js:28:25)
    at internals.Auth.test.internals.Auth._authenticate (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/lib/auth.js:222:16)
    at internals.Auth.test.internals.Auth.authenticate (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/lib/auth.js:197:17)
    at each (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/lib/request.js:401:16)
    at iterate (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/node_modules/items/lib/index.js:36:13)
    at done (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/node_modules/items/lib/index.js:28:25)
    at /home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/lib/protect.js:50:16
    at wrapped (/home/satnam-sandhu/Workstation/cuboid.io/node_modules/hapi/node_modules/hoek/lib/index.js:875:20)

Solution

  • I assume you are using an older version of hapi 17.0.0, in order to to reply with html use https://github.com/hapijs/vision. Also this example tutorial should help https://futurestud.io/tutorials/hapi-how-to-render-views. Hapi will do most of the work for you. If you want to use node's res and req http server objects you need to expose the raw request and response objects from hapi's internals as documented here https://hapijs.com/api/16.5.2#request-properties under raw property.