Заменить некоторую часть строки из объекта на возвращаемую переменную или функцию - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть объект, содержащий строку в config.js

exports.message = {
    fromname    : 'admin@bebestorescake.com',
    fromemail   : 'admin@bebestorescake.com', 
    subject     : 'subjek {randomip} {email} {date}', 
    text        : 'Plaintext version of the message',
    letter      : 'your-letter.html',
    list        : 'your-list.txt'
}

В другом файле мне нужно заменить строку {email} {date} {randomip} на некоторую переменную или функцию, возвращаемую следующим образом

{email} replace to email();
{date} replace to date();
{randomip} replace to randomip();

Как это сделать в Node.js

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

Вы также можете заменить строку в config.js на функцию:

exports.message = {
    fromname    : 'admin@bebestorescake.com',
    fromemail   : 'admin@bebestorescake.com', 
    subject     : ({randomip, email, date}) => `subjekt ${randomip || ''} ${email || ''} ${date || ''}`, 
    text        : 'Plaintext version of the message',
    letter      : 'your-letter.html',
    list        : 'your-list.txt'
}

А затем при необходимости передайте аргументы:

message.subject({
  email: email(), 
  date: date()
})
0 голосов
/ 13 сентября 2018

Вы можете использовать литералы шаблона в качестве быстрого решения:

const replaceTemplate = () => {
  const {email, name} = require('./config.js')
  return `
    ${email} this is an email
    Hello ${name}
  `;
};

Array.prototype.reduce () также отлично работает:

const template = 'This is an {email} for {name}';

const obj = {
  email: 'hello@world.com',
  name: 'John Doe'
};
Object.keys(obj).reduce((prev, curr) => prev.replace(`{${obj[curr]}}`), template)
0 голосов
/ 13 сентября 2018

Я бы реализовал это, реализовав функцию заменителя с таблицей диспетчеризации:

let { message } = require('config');

function replaceTokens(template) {
  const dispatcher = {
    email: () => 'somestaticaddress@example.com',
    randomip: () => {
      const randomInt = () => Math.floor(Math.random() * 256);
      return `${randomInt()}.${randomInt()}.${randomInt()}.${randomInt()}`;
    },
    date: () => (new Date()).toISOString()
  };
  let output = template;
  template.match(/\{[^}]*\}/g)
    .map(match => match.substring(1, match.length - 1))
    .forEach(token => {
      output = output.replace(new RegExp(`{${token}}`,'g'), dispatcher[token]());
    });
  return output;
}

message.subject = replaceTokens(message.subject);

Вышеуказанное заменит все экземпляров токенов в субъекте.

0 голосов
/ 13 сентября 2018

Вы можете просто связать String#replace() для этого:

let exports = {};
exports.message = {
    fromname    : 'admin@bebestorescake.com',
    fromemail   : 'admin@bebestorescake.com', 
    subject     : 'subjek {randomip} {email} {date}', 
    text        : 'Plaintext version of the message',
    letter      : 'your-letter.html',
    list        : 'your-list.txt'
}

exports.message.subject = exports.message.subject
  .replace("{randomip}", randomip())
  .replace("{email}", email())
  .replace("{date}", date());

console.log(exports.message)

// replace this with your own logic
function email(){return "name@domain.tld"}
function randomip(){return "127.0.0.1"}
function date(){return (new Date()).toLocaleString()}

И если вы уверены, что не обрабатываете пользовательский ввод, вы также можете использовать eval. Это действительно не зло, просто неправильно поняли:

let exports = {};
exports.message = {
  fromname: 'admin@bebestorescake.com',
  fromemail: 'admin@bebestorescake.com',
  subject: 'subjek {randomip} {email} {date}',
  text: 'Plaintext version of the message',
  letter: 'your-letter.html',
  list: 'your-list.txt'
}

exports.message.subject = exports.message.subject
  .replace(/{([a-zA-Z]+)}/g, function(match) {
    return eval(match.substring(1, match.length - 1) + "()");
  });

console.log(exports.message)

// replace this with your own logic
function email() {return "name@domain.tld"}
function randomip() {return "127.0.0.1"}
function date() {return (new Date()).toLocaleString()}

let exports = {};
exports.message = {
  fromname: 'admin@bebestorescake.com',
  fromemail: 'admin@bebestorescake.com',
  subject: 'subjek {email} {email} {date}',
  text: 'Plaintext version of the message',
  letter: 'your-letter.html',
  list: 'your-list.txt'
}

exports.message.subject = exports.message.subject
  .replace(/{([a-zA-Z]+)}/g, function(match) {
    return eval(match.substring(1, match.length - 1) + "()");
  });

console.log(exports.message)

// replace this with your own logic
function email() {return "name@domain.tld"}
function randomip() {return "127.0.0.1"}
function date() {return (new Date()).toLocaleString()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...