Прототип объекта не работает в Node.JS

У меня возникает небольшая проблема, когда я пытаюсь создать прототип объекта в моем приложении node / express.

Сначала я начинаю с создания такого прототипа:

Object.prototype.printObject = function () {
  return console.info(this);
}

Теперь проблема в том, когда я вызываю эту функцию. Например, когда я вызываю такую ​​функцию:

let request = {1:2}
request.printObject();
*//Logs {1:2}*

Ошибок не возникает. Но когда я вызываю функцию вот так:

let request = req.body
request.printObject();

Моя программа вылетает с ошибкой: TypeError: request.printObject is not a function

Кто-нибудь знает, почему это происходит?

В чем ценность req.body?

kshetline 06.04.2018 04:44

Надеюсь, вы уже знаете, что изменять свойство prototype любого класса, который не принадлежит / не написан вами, - очень плохая идея.

Bryan Chen 06.04.2018 04:51

Значение - это тело запроса, отправленного через Postman. В данном случае: {email: "[email protected]', password: 'testing1234'}

Christofer Johnson 06.04.2018 08:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
380
3

Ответы 3

если вам требуется ('body-parser')? или req.body undefined, вам нужно сделать это в первую очередь

var bodyParser = require('body-parser') 
app.use(bodyParser.urlencoded({ extended: false }))

Вместо попытки создать прототип любого объекта вы можете создать такую ​​функцию промежуточного программного обеспечения:

app.use(function (req, res, next) {
  console.info('req');
  //you could also add any function to req,even so thats not a common thing to do
  req.printObject = function { ... }
  next();
});

Вероятно, проблема с вашим подходом заключается в том, что вы добавляете функцию в прототип объекта после того, как объект запроса был создан. (Обновлено: это неверно, см. Комментарии)

прототипы являются общими, поэтому изменение после создания объекта не будет проблемой

Bryan Chen 06.04.2018 04:54

Вы добавили метод printObject к прототипу Object. Итак, если req.body - это Объект, вы должны иметь возможность вызвать метод.

Попробуйте проверить тип req.body с помощью console.info(typeof req.body), чтобы убедиться, что это объект.

Если это не так, вы должны использовать узел узла 'body-parser' для заполнения req.body проанализированным содержимым тела.

Например, части вашего серверного кода могут выглядеть так:

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
app.use(bodyParser.json()); // Data is being sent to the server in JSON format

app.post('/my/endpoint', function(req, res){
    req.body.printObject();
});

Модуль body-parser поддерживает и другие форматы. В качестве примера я использовал JSON. Вы можете найти все, что они поддерживают, здесь: https://www.npmjs.com/package/body-parser

Я проверил тип объекта, и он действительно вернул, что это объект. также консольный журнал самого объекта возвращает объект JSON со значениями.

Christofer Johnson 06.04.2018 08:54

Вы абсолютно уверены, что код, который присоединяет метод printObject к прототипу объекта, выполняется до того, как вы попытаетесь вызвать его на req.body? Не могли бы вы опубликовать более длинный фрагмент кода, показывающий, где именно вы прикрепляете метод к прототипу и где вы его вызываете?

Ravi Mashru 06.04.2018 16:08

Другие вопросы по теме