Search code examples
javascriptnode.jsfunctionrandomcall

call a function from another file and get a random result for each call


I have a random.js file containing this to get random fake ip

exports.ip = function () {
    let random = (Math.floor(Math.random() * 255) + 1)+"."+(Math.floor(Math.random() * 255) + 0)+"."+(Math.floor(Math.random() * 255) + 0)+"."+(Math.floor(Math.random() * 255) + 0); 
    return random
}

and I call the variable in the send.js file to replace string {randomip}

let replace_tag = function (to) {

    config.message.subject = config.message.subject
        .replace("{randomip}", random.ip)
        .replace("{email}", to)
        .replace("{date}", random.date);

    config.message.fromname = config.message.fromname
        .replace("{randomip}", random.ip)
        .replace("{email}", to)
        .replace("{date}", random.date);

    config.message.fromemail = config.message.fromemail
        .replace("{randomip}", random.ip)
        .replace("{email}", to)
        .replace("{date}", random.date);

}

but it will only produce one generated ip, I want to make it generate random every time it is called will produce different values

I have tried inserting it in the loop but still not working

I call the replace function in another function then enter it into loop like that

let kirim = function (to) {

    replace_tag(to);

    let message = {
        from: config.message.fromname+'<'+config.message.fromemail+'>',
        to: to,
        subject: config.message.subject,
        text: config.message.text,
        html: html
    };

    transporter.sendMail(message, (error, info) => {
        if (error) {
             return console.log(error.response)
        }
        console.log('Message sent: ',info.accepted);
    });
};


(async () => {

    for (var i in list) {

        kirim(list[i]);
        await delay(config.send.delay*1000); 

    }

})();

Solution

  • I call the replace function in another function then enter it into loop

    Ah, there's your problem. Your replace_tag function will change the config object, and after the first call it doesn't contain the template tag any more but the replacement result. Further calls to replace_tag won't find {randomip} in your configuration any more, so no new ips are generated.

    You should instead keep the configuration constant (immutable), and create new message objects every time you need one. Each of those objects will then have different randomised IP addresses.

    // takes a string, returns a new string
    function replace_tags(input, email) {
        return input
        .replace("{randomip}", random.ip)
        .replace("{email}", email)
        .replace("{date}", random.date);
    }
    // returns a new object, leaves config.message unaltered
    function get_customised_message_template(to) {
        return {
            subject: replace_tags(config.message.subject, to),
            fromname: replace_tags(config.message.fromname, to),
            fromemail: replace_tags(config.message.fromemail, to),
        };
    }
    
    function kirim(to) {
        const random_message = get_customised_message_template(to);
    //  ^^^^^^^^^^^^^^^^^^^^^^
        const message = {
            from: random_message.fromname+'<'+random_message.fromemail+'>',
            to: to,
            subject: random_message.subject,
            text: config.message.text,
            html: html
        };
    
        transporter.sendMail(message, (error, info) => {
            if (error) console.log(error.response);
            else console.log('Message sent: ', info.accepted);
        });
    };