Доступ к прототипу запрещен, правильный способ справиться с этим? «x» не является «собственным свойством» своего родителя

#express #sequelize.js #handlebars.js #express-handlebars

#экспресс #sequelize.js #handlebars.js #express-handlebars

Вопрос:

Как и многие другие, я получал эту ошибку при использовании Sequelize с Express и Express-handlebars:

Handlebars: Access has been denied to resolve the property "first_name" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details
Handlebars: Access has been denied to resolve the property "last_name" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
See https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access for details

Я нашел несколько ответов о том, как обойти это. ie: разрешить протометоды или добавление установки npm @handlebars / разрешить доступ к прототипу

Что мне интересно, есть ли правильный способ обработки данных или исключения методов proto из ответа sequelize?

Возможно, я неправильно понимаю проблему, поэтому, если это так, я приношу извинения. Я просто ищу «правильный» способ справиться с этим.

Редактировать: Чтобы прояснить немного больше, я пытаюсь сделать что-то таким образом, чтобы создать наиболее безопасное приложение.

Из handlebarsjs.com:
Using these properties may open security holes.

ОБНОВИТЬ!

Я все еще пытаюсь решить эту проблему, но я заметил интересное поведение.

Вложенные объекты, похоже, вызывают эту проблему.

Похоже, что это срабатывает, когда данные во вложенном объекте доступны / отображаются на HTML-странице (пример: {{contact.first_name}}

иногда он будет иметь вложенные dataValues объекты внутри объекта, а иногда и нет.

Я бы привел пример, включающий значения данных, но он некоторое время так не отображался.

Возвращаемый объект:

 {
        "id": 3,
        "email": "email2@email.com",
        "password": "$2b$10$fOGiJC6NgUTR4qIt7/R7vuwpaFb3PUl9ks2vHBEkLnOUmRN0tEFue",
        "kind": "user",
        "createdAt": "2020-08-16T04:37:58.000Z",
        "updatedAt": "2020-08-16T04:37:58.000Z",
        "Contact": {
            "id": 3,
            "first_name": "Jane",
            "last_name": "Doe",
            "gender": "female",
            "city": "Long Beach",
            "state": "CA",
            "zip": 12345,
            "phone_number": 1234567891,
            "createdAt": "2020-08-16T04:37:58.000Z",
            "updatedAt": "2020-08-16T04:37:58.000Z",
            "UserId": 3
        },
        "Props": []
    }
  

Я не обязательно вижу какие-либо другие явные типы данных, которые вызывают это сообщение об ошибке. (Это не значит, что их нет, но до сих пор каждый тип данных и скрипт, которые я передал, не вызвали проблем.)

Данные, с которыми у меня возникла проблема: Эти данные взяты из ответа на запрос Sequelize, показанного выше.

 let hbsObject = {
   user: data[0],
   contact: data[0].Contact
};
  

Notes about what happened with this data:

  1. I used a promise to chain several queries at once.
    • User was queried, and contact was included in that query, so there were nested objects/data in the response. (obviously)
  2. When I tried to render the first and last names from the data I was receiving the error message.

Data that seems to have solved my error:

 let user = {
   id: data[0].id,
   email: data[0].email,
   kind: data[0].kind,
   createdAt: data[0].createdAt,
   updatedAt: data[0].updatedAt,
};

let hbsObject = {
  user: user,
  contact: data[0].Contact.dataValues,
};
  

Это странно, потому что иногда, когда вы просматриваете данные в консоли, dataValues будут видны, а иногда нет. Однако, когда вы обращаетесь к нему, как я показал выше, ошибка удаляется.

Текущий вывод

  • Данные, к которым вы хотите получить доступ на странице handlebars через объект handlebars, не должны находиться во вложенном объекте.

Что это значит?

Похоже, это означает, что вы должны либо деконструировать его перед передачей данных на страницу либо вручную (как я сделал с user ), либо отправляя данные с уровня объекта 1 за раз (как я сделал с contact ).

Если кто-нибудь может использовать это или расширить дополнительную информацию, я был бы очень признателен! Я отредактирую снова, если станет доступна дополнительная информация.

UPDATE2

Массив объектов недоступен, поскольку это список объектов, вложенных в массив. Это создает {{#each x}} проблему. Отдельные данные были доступны с помощью описанного выше метода.

UPDATE3

Я не смог найти никакого четкого решения этой проблемы. В конце концов, я просто разрешил методы proto с handlebars/allow-prototype-access пакетом.

Пока вы единственный, у кого есть доступ к вашему шаблону / вы абсолютно на 100% доверяете тому, у кого также есть доступ к вашему шаблону, тогда это не должно быть проблемой. Если это не так, я бы предложил использовать что-то другое, кроме handlebars на данный момент.

Ответ №1:

0

Если вы используете MySQL, продолжайте, используйте необработанные параметры запроса {raw: true}, а если вы используете отношения, вы можете использовать {nest: true}, например:

 users = await User.findAll({
    where: { username: "SimonAngatia" },
    include: [{ model: Tweet, as: "Tweets" }],
    raw: true,
    nest: true,
  }).catch(errorHandler);
  

смотрите здесь: Продолжить, преобразовать сущность в обычный объект