Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何将从response.on('end')获取的数据发送回客户端_Node.js - Fatal编程技术网

Node.js 如何将从response.on('end')获取的数据发送回客户端

Node.js 如何将从response.on('end')获取的数据发送回客户端,node.js,Node.js,我是NodeJs新手,在响应方面遇到了问题。在“结束”时,我仍然无法找到将从响应中获得的数据发送到客户端的方法 exports.getCheckoutSession = catchAsync(async (req, res, next) => { const uuidv1 = require('uuid/v1'); const https = require('https'); const tour = await Tour.findById(req.params.tour

我是NodeJs新手,在响应方面遇到了问题。在“结束”时,我仍然无法找到将从响应中获得的数据发送到客户端的方法

  exports.getCheckoutSession = catchAsync(async (req, res, next) => {
  const uuidv1 = require('uuid/v1');
  const https = require('https');
  const tour = await Tour.findById(req.params.tourId);
  console.log(tour);
  //parameters send to MoMo get get payUrl
  var endpoint = 'https://test-payment.momo.vn/gw_payment/transactionProcessor';
  var hostname = 'https://test-payment.momo.vn';
  var path = '/gw_payment/transactionProcessor';
  var partnerCode = 'MOMO';
  var accessKey = 'accessKey';
  var serectkey = 'secretKey';
  var orderInfo = 'pay with MoMo';
  var returnUrl = 'https://momo.vn/return';
  var notifyurl = 'https://callback.url/notify';
  var amount = (tour.price * 23000).toString();
  console.log(amount);
  var orderId = req.params.tourId;
  var requestId = req.params.tourId;
  var requestType = 'captureMoMoWallet';
  var extraData = 'merchantName=;merchantId='; //pass empty value if your merchant does not have stores else merchantName=[storeName]; merchantId=[storeId] to identify a transaction map with a physical store

  //before sign HMAC SHA256 with format
  //partnerCode=$partnerCode&accessKey=$accessKey&requestId=$requestId&amount=$amount&orderId=$oderId&orderInfo=$orderInfo&returnUrl=$returnUrl&notifyUrl=$notifyUrl&extraData=$extraData
  var rawSignature =
    'partnerCode=' +
    partnerCode +
    '&accessKey=' +
    accessKey +
    '&requestId=' +
    requestId +
    '&amount=' +
    amount +
    '&orderId=' +
    orderId +
    '&orderInfo=' +
    orderInfo +
    '&returnUrl=' +
    returnUrl +
    '&notifyUrl=' +
    notifyurl +
    '&extraData=' +
    extraData;
  //puts raw signature
  console.log('--------------------RAW SIGNATURE----------------');
  console.log(rawSignature);
  //signature
  const crypto = require('crypto');
  var signature = crypto
    .createHmac('sha256', serectkey)
    .update(rawSignature)
    .digest('hex');
  console.log('--------------------SIGNATURE----------------');
  console.log(signature);

  //json object send to MoMo endpoint
  var body = JSON.stringify({
    partnerCode: partnerCode,
    accessKey: accessKey,
    requestId: requestId,
    amount: amount,
    orderId: orderId,
    orderInfo: orderInfo,
    returnUrl: returnUrl,
    notifyUrl: notifyurl,
    extraData: extraData,
    requestType: requestType,
    signature: signature
  });
  //Create the HTTPS objects
  var options = {
    hostname: 'test-payment.momo.vn',
    port: 443,
    path: '/gw_payment/transactionProcessor',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Content-Length': Buffer.byteLength(body)
    }
  };

  //Send the request and get the response
  console.log('Sending....');
  var req = https.request(options, res => {
    console.log(`Status: ${res.statusCode}`);
    console.log(`Headers: ${JSON.stringify(res.headers)}`);
    console.log('Type of body', JSON.stringify(res.body));
    res.setEncoding('utf8');
    let fullBody = '';
    res.on('data', body => {
      fullBody += body;
      console.log(' Real Body');
      console.log(fullBody);
      //console.log('Type of body', body.payUrl);

      // console.log(JSON.parse(body).payUrl);
      // res.redirect(JSON.parse(body).payUrl);
    });
    res.on('end', () => {
      const payURL = JSON.parse(fullBody).payUrl;
      console.log('payUrl', payURL);
      console.log('No more data in response.');
    });
  });

  req.on('error', e => {
    console.log(`problem with request: ${e.message}`);
  });

  // write data to request body
  req.write(body);
  req.end();
});
这是我从回复中得到的url

payUrl https://test-payment.momo.vn/gw_payment/payment/qr?partnerCode=MOMO&accessKey=F8BBA842ECF85&requestId=5f38cc86954a6206211e2842&amount=23000&orderId=5f38cc86954a6206211e2842&signature=37ae247d56efd9ed6630b7d7d1435b88ffb8895956da5711a62ebbab8118aa7b&requestType=captureMoMoWallet
您能告诉我如何将上图中的payURL“end”上的res.on数据发送到客户端吗。我尝试过一些方法,比如res.writeHead、res.send、res.json。。。。但它们都返回了错误:res.send、res.writeHead、res.json。。。这不是一个函数

这是我的客户端。如果你们不介意,请告诉我当客户端点击我的按钮时,如何自动重定向上面的payURL站点。我应该像上面那样继续使用window.location.replace吗

export const bookTour = async tourId => {
try {
    const res = await fetch(
      `http://localhost:3000/api/v1/bookings/checkout-session/${tourId}`,
      {
        method: 'POST',
        body: 'a=1'
      }
    ).then(res => window.location.replace(res.redirectURL));
    console.log('The res', res);
  } catch (err) {
    showAlert('error', err);
  }
};
这是我的index.js

 if (bookBtn) {
  bookBtn.addEventListener('click', e => {
    e.target.textContent = 'Processing...';
    const tourId = e.target.dataset.tourId;
    bookTour(tourId);
  });
}
通过对http请求使用相同的名称,可以从getCheckoutSession处理程序中隐藏req/res变量。如果将其更改为:

const request = https.request(options, response => {
    // ...
    let fullBody = '';
    response.on('data', body => {
      fullBody += body;
    });
    response.on('end', () => {
      const payURL = JSON.parse(fullBody).payUrl;
      // access the handler "res" object here
      res.send(payURL);
      // alternatively use res.json({payURL}) to send a json response
    });
});
它应该很好用

注意:现在,您肯定应该使用const/let而不是var,有关更多信息,请参见

res.on('end', () => {
   const payURL = JSON.parse(fullBody).payUrl;
   res.json({
     payURL: payURL
   })
});
或者其他方式

res.on('end', () => {
  const payURL = JSON.parse(fullBody).payUrl;
  res.status(200).send({
    payURL: payURL
  });
});

非常感谢你,天哪。。。我已经被这个问题困扰了3天多,阅读了这么多文档,尝试了不同的方法,但仍然找不到原因。今天,我终于发现了。最近三天我睡不好。1000%感谢您的帮助。很高兴为您提供帮助!: