Search code examples
node.jsnpmencodingnewmanwindows-1252

How to run Node.js module 'windows-1252' along with require statements


Trying to correctly write a .json file from data.response.stream from a POST request using Node.js and Newman on Windows 10 AWS EC2. The default encoding is cp1252, but the response encoding is utf-8, and after attempts using iconv, iconv-lite, futzing with Buffer, I can't seem to arrive at a satisfactory result.

Here's the code I'm using:

const newman = require('newman'); // require Newman in the project
const fs = require('fs'); // require the Node.js module 'File System'
var url = require('url');
const https = require('https');
var path = require('path');
const { Iconv } = require('iconv').Iconv;
const iconvlite = require('iconv-lite');
const utf8 = require('utf8');
const windows1252 = require('windows-1252');
var requirejs = require('requirejs');
//import {encode, decode, labels} from 'windows-1252';
//import * as windows1252 from 'windows-1252';

//const collectionURL = 'https://www.getpostman.com/collections/mycollection';
let pageNumber = 16287;

// call newman.run to pass `options` object and wait for callback
newman.run({
    collection: require('./postman-collection.json'),
    iterationData: './iteration-data.csv',
    color: 'on',
    verbose: 'on',
    exportCollection: './/after_pmRuns',
    delayRequest: 500,
    environment: require('./postman-environment.json'),
    reporters: 'cli',
}).on('request', (error, data) => {
    if (error) {
        console.log(error);
        return;
    }
    console.log('Request name: ' + data.item.name);
    console.log(data.response.stream.toString());
    var currentPageNumber = pageNumber++;
    const requestName = data.item.name.replace(/[^a-z0-9]/gi, '-');
    const randomString = Math.random().toString(36).substring(7);
    const fileName = `./results/_00${currentPageNumber}-response-${requestName}-${randomString}.json`;
    const encodedData = windows1252.encode(data.response.stream.toString(), {
        mode: 'fatal'
    });
    const decodedData = iconvlite.decode(encodedData, 'utf-8');
    //var iconv = new Iconv('windows-1252', 'UTF-8//TRANSLIT//IGNORE');
    //var content = data.response.stream;
    //var buffer = iconv.convert(content);
    //var new_content = buffer.toString('utf8')
    //const win = iconvlite.encode(data.response.stream, "windows1252");
    //const utfStr = iconvlite.decode(win, "utf-8");
    //const requestContent = data.response.stream.toString();
    //return str.toString();
    fs.writeFileSync(fileName,  decodedData, function(error) {
        if (error) {
            console.error(error);
        }
    });
});

I keep getting ascii encoded .json files after opening in Notepad. And occasionally I'm getting replacement characters like \ufffd or variations of that.

When I try to adjust the package.json, I Newman throws an error since it's in a require statement, but when I try to import windows-1252 it says it's undefined.

Any ideas on how I can workaround this?


Solution

  • I hope we don't need encode or decode response data, we can simply use "parse" for buffur data to response json.

    JSON.parse(responseData);