Javascript объект ведет себя таинственно в node.js, но прекрасно работает в jsbin - PullRequest
0 голосов
/ 27 января 2019

У меня таинственная проблема в javascript для node.js. Я регистрирую row объект, который выглядит как {'email': '15', surveyLink: 'hghgh', name: 'LOO'} в node.js. Вы можете видеть, что в письме есть кавычки. У меня проблема с этим ключом. Я попробовал тот же код в jsbin, и он работает нормально, но это вызывает проблему в javascript node.js. https://jsbin.com/curirikoxo/edit?html,console,output Я пытаюсь внести изменения в HTML таким образом, чтобы при каждом появлении {{+key+}} я хотел изменить его на значение объекта для этого ключа. Он отлично работает в jsbin, но когда я выполняю тот же код в javascript для node.js, {{email}} в html не заменяется его значением. Можете ли вы сказать мне, что может быть причиной этого?

Я пробовал такие вещи, как JSON.stringify() объект, а затем снова JSON.parse() объект, но никакого эффекта этого не происходит в результате. Я чувствовал, что ключ email может иметь кавычки, подобные этому 'email', при использовании ключа в html.replace(new RegExp(match, 'g'), row[key]), который может вызывать проблему, поэтому я проверил key.indexOf('\''), но журналы выдавали -1. Я пробовал много других вещей, и я сошел с ума и чувствую разочарование по поводу этой глупой проблемы.

  function replaceVariablesWithDataInTemplate(html,row){
  let keys=Object.keys(row);
  console.log(JSON.parse(JSON.stringify(row)));
  for (var key of keys){
  let match="{{"+key+"}}";
 console.log(html.indexOf(key));
      console.log(Object.keys(row).forEach(key => { console.log(key, '-', 
      key.charAt(0), ':', key.charCodeAt(0)); })); //update-3
  html=html.replace(new RegExp(match, 'g'), row[key]);
  }

Можете ли вы сказать мне, почему это происходит в javascript для node.js, но работает нормально в jsbin? Также можете ли вы предложить мне несколько способов его преодоления?

Обновление 1: этот объект строки получен из пожарного депо. Я не могу найти причину того, почему только ключ электронной почты имеет кавычки вокруг него в объекте строки. Также я хотел бы поделиться всеми строками в firestore, которые пишутся из файла csv, хранящегося в хранилище firebase, и анализируются с использованием модуля papaparse. Это электронное письмо является первым столбцом csv, ранее name был первым столбцом в csv, и в то время имя ключа вызывало проблему. Когда я обновляю документ из консоли firestore, удаляя ключ email и записывая его снова с тем же значением, моя функция дает правильные результаты, и в обоих случаях способ, которым ключ email выглядит в firestore, одинаков, то есть кавычки не отображаются email поле в консоли пожарного депо.

Обновление-2: Я добавляю снимок экрана с тем, как выглядят журналы до и после удаления и чтения ключа email с тем же значением ниже в облачном хранилище.

enter image description here

Обновление-3:

email -  : 65279
surveyLink - s : 115
name - n : 110
undefined
email -  : 65279
surveyLink - s : 115
name - n : 110
undefined
email -  : 65279
surveyLink - s : 115
name - n : 110
undefined

1 Ответ

0 голосов
/ 27 января 2019

Похоже, проблема в искаженном источнике данных, CSV-файле в вашем случае. Итак, в вашей базе данных ключ email начинается с символа спецификации.

Самый простой обходной путь - это "очистить" объекты после извлечения их из базы данных.

Например, вы можете использовать функцию:

function cleanUp(obj) {
  const keys = Object.keys(obj);
  return keys.reduce((acc, key) => {
    const value = obj[key];
    const cleanKey = key.charCodeAt(0) === 0xFEFF ? key.substr(1) : key;
    acc[cleanKey] = value;
    return acc;
  }, {});
}

Вы можете использовать его как:

function replaceVariablesWithDataInTemplate(html,obj) {
  const row = cleanUp(obj);
  let keys=Object.keys(row);
  console.log(JSON.parse(JSON.stringify(row)));

  for (var key of keys) {
    let match="{{"+key+"}}";
    console.log(html.indexOf(key));
    html = html.replace(new RegExp(match, 'g'), row[key]);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...