Node Js (Express) - POST req.body пусто (необычно) - PullRequest
0 голосов
/ 14 апреля 2020

Я не понимал, насколько распространена и сложна эта проблема. Я провел много часов, рассматривая все предыдущие ситуации и ответы. Само собой разумеется, ни один не применяется. Я делаю POST-вызов httpClient от Angular 5 до узлаjs / express url. Приложение выполняет многие из этих вызовов, и все работает, кроме этой:

Angular компонент

 this.ezzy.post(this.config.api.createConnectAccount, this.AuthCode, true, true, true)
                     .subscribe((data) => {
              if (data.code === '0') {

angular http вызов

 ngOnInit() {
   ........
  createConnectAccount(url, body, loadingIcon, withCredentials, showErrorToast) {
       console.log(`CREATE CONNECT ACCOUNT....${url}...${JSON.stringify(body)}`);
      const headers = this.ezzy.preAjax(loadingIcon, withCredentials);
      return this.http.post(url, body, { withCredentials, headers })
        .map((res) => this.ezzy.postAjax(res, showErrorToast))
        .catch((err) => this.ezzy.handleError(err));

     }

Я могу подтвердить что и URL, и код authCode / body являются правильными и соответствуют этой точке.

router.post (Nodejs)

router.post('/users/createConnectAccount', async(req, res, next) => {

   // console.log (`REQ BODY FROM PAYOUT DASH:  ${JSON.stringify(req)}`);
    console.log(`ENTER CREATE CONNECT ACCOUNT...code......${req.body.code}`);
    console.log(`ENTER CREATE CONNECT ACCOUNT..body......${JSON.stringify(req.body)}`);
    console.log(`REQ HEADERS: ${JSON.stringify(req.headers)}`);

Вот различия с другими подобными вызовами: 1. Компонент angular был активирован из внешнего вызова к его конечной точке (localhost: 3000 / дилер? Code = '1234'. Код был успешно получен в конструкторе компонента и назначен authCode. 2. http * angular вызов инициирован внутри ngOnInit. Я пытаюсь получить некоторую информацию и обновить базу данных перед рендерингом страницы компонента.

Я использую

app.use(json());
app.use(urlencoded({
  extended: true
}));

и console.log требования. заголовок перед вызовом выглядит так:

 ENTER CREATE CONNECT ACCOUNT...code......undefined
ENTER CREATE CONNECT ACCOUNT..body......{}
REQ HEADERS: {"host":"localhost:3000","connection":"keep-alive","content-length":"35","accept":"application/json, 
text/plain, */*","sec-fetch-dest":"empty","user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36","content-type":"text/plain","origin":"http://localhost:3000","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","referer":"http://localhost:3000/payout-dashboard?code=ac_H5nP4MUbEbp94K13jkA5h1DRG6f6pgOn&state=2lt8v9le8a5","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"connect.sid=s%3AsWLHYTY02P2EvYZy1FIVQzZLC6M0vR5p.GnU%2BU20RcjPYeG3lAUEDV9q1vmLceBPAfEE488ej5M4; _ga=GA1.1.695338957.1586021131; _gid=GA1.1.1793736642.1586291730; PDToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJlbWFpbCI6InNlYWthaG1haWxAZ21haWwuY29tIiwibmlja25hbWUiOiIiLCJjYXRlZ29yeSI6IiIsImlhdCI6MTU4NjgyMDYyMSwiZXhwIjoxNjE4MzU2NjIxfQ.09gx1F_YJPxAs7BiiYToetdJhjd5DsUUkdoo3leFscU; io=yysQe40_plBblVuSAAAA"} 

Если вы заметили, что тип контента:

 "content-type":"text/plain"

, а допустимое значение:

"accept":"application/json, 
    text/plain, */*"

и код присутствует:

code=ac_H5nP4MUbEbp94K13jkA5h1DRG6f6pgOn&state=2lt8v9le8a5"

ДА ... Я получаю пустое req.body.

Кстати ... это работает от почтальона

ENTER CREATE CONNECT ACCOUNT...code......ac_H5ikfuYleQromTeP5LnHGEmfEWaYD3he
ENTER CREATE CONNECT ACCOUNT..body......{"code":"ac_H5ikfuYleQromTeP5LnHGEmfEWaYD3he"}
REQ HEADERS: {"user-agent":"PostmanRuntime/7.24.1",
"accept":"*/*","postman-token":"0d5faea6-4684-408e-9235-c5e14b306918",
"host":"localhost:3000",

"accept-encoding":"gzip, 
deflate, br","connection":"keep-alive",
"content-type":"application/x-www-form-urlencoded",
"content-length":"40","cookie":"connect.sid=s%3ASahJY3VqXVjTjXF1X-SlU_9Shexa59Tm.Q0SRM1h%2FxJnoEnjS3u3I3x%2F%2FnLs%2FLzyiHGoJNuo0U7M"}

Извините, что так долго ... но я сбит с толку

1 Ответ

0 голосов
/ 14 апреля 2020

Промежуточное ПО urlencoded express анализирует тело только тогда, когда Content-Type запроса соответствует опции type. По умолчанию опция типа application/x-www-form-urlencoded. Либо установите Content-Type вашего запроса с text/plain на application/x-www-form-urlencoded, либо передайте {"type": "text/plain"} на urlencoded(...), чтобы перезаписать поведение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...