nextjs fetch - Request body length does not match content-length header - node.js

I have 2 apps on vercel - one is nextjs, the other is FastAPI in python. The nextjs node api needs to get some data from the FastApi app.
I keep getting this content-header mismatch. What am I missing?
cause: RequestContentLengthMismatchError: Request body length does not match content-length header
at AsyncWriter.end (node:internal/deps/undici/undici:8417:19)
at writeIterable (node:internal/deps/undici/undici:8327:16) {
code: 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'
}
My post request in node API:
const body = JSON.stringify({ data: value })
const response = await fetch(`${FAST_API_HOST}/api/data`, {
method: 'POST',
headers: {
'Accept': 'application/json; charset=utf-8',
'Content-Type': 'application/json',
'Content-Length': body.length.toString(),
'Connect': 'keep-alive',
},
body
})
.then(async res => {
if (res.status === 200) return res.json();
else throw new Error(await res.text())
})

Related

Get request works with postman but with browser

Get request sent from POSTMAN works but when sent from browser fails.
At the backend req.body is undefined even after using bodyparser middleware.
The same requet when sent from the POSTMAN works.
This is the axios call from the frontend.
await axios.get(`${API_URL}/api/authenticate`, {
accesstoken: localStorage.getItem("accesstoken")
},
{
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Access-Control-Allow-Origin': '*',
'Accept-Encoding': 'gzip, deflate, sdch'
}
})
.then((res) => console.log(res))
.catch((err) => {
localStorage.removeItem("accesstoken");
console.log(err)
});
This is the backend auth handler
const isAuthenticated = (req,res,next)=>{
const accesstoken = req.body.accesstoken;
console.log(req.body);
if(!accesstoken)
{
res.json({msg:"No token provided"});
}
else
{
jwt.verify(accesstoken,process.env.ACCESS_TOKEN_SECRETE,(err,decoded)=>{
if(err)
{
res.json({msg:"Invalid token"});
}
else
next();
});
}
}
These are the cors options
app.use(cors({
origin:["http://localhost:3000","http://192.168.0.86:3000"],
optionsSuccessStatus:200,
credentials:true,
allowHeaders:["Content-Type"]
}));
The method signature you are using for axios.get applies to axios.post where the second parameter is the request body. This doesn't hold true for axios.get. You can pass query paramters as second argument of axios.get. Postman is allowing you to make GET requests with body and the server is okay with that but it isn't advised to do so. For your use case of authentication, use POST.
I guess, you meant to do axios.post:
await axios.post(`${API_URL}/api/authenticate`, {
accesstoken: localStorage.getItem("accesstoken")
},
{
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Access-Control-Allow-Origin': '*',
'Accept-Encoding': 'gzip, deflate, sdch'
}
})
.then((res) => console.log(res))
.catch((err) => {
localStorage.removeItem("accesstoken");
console.log(err)
});

Node post request on steam

I am trying to create script that could post comment in my thread on steam with node and request lib. Trying to achieve by doing something like this:
const body = {
comment: 'Sometext',
count: '15',
sessionid: session_id,
}
bumpingDiscussionsPostsModule.bumpInDiscussion=async() => {
const postHeader = {
method: 'POST',
uri: urlPost,
headers: {
Cookie: cookie
},
form: JSON.stringify(body)
}
const response = await request(postHeader);
console.log(response);
}
Tho steam keeps returning me returning {"success":false}, any clues what I am doing wrong?
I was just formatting it wrong. If someone might be looking for it, this gets the job done:
const doBump = await fetch(bumpingUri, {
method: 'post',
body: `comment=${process.env.BUMP_COMMENT}&count=15&sessionid=${process.env.CONN_SESID}&extended_data=${process.env.EXTENDED_DATA}&feature2=${featureID}oldestfirst=true&include_raw=true`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'accept': 'text/javascript, text/html, application/xml, text/xml, */*',
Cookie: process.env.CONN_STRING
}
});

HTTP call to send data to server using Axios/Axios-retry

I have a JSON object that I wish to send to a server using the server's API key. I wish to have a retry count of 3 so that I can retry sending data if previous calls fail.
I am not sure whether to use 'axios-retry' or 'retry-axios'.
How do I configure the Content-Type in the header, and where do I add the API key and the data to be sent. My present code looks like this:
const axiosRetry = require('axios-retry');
axiosRetry(axios, { retries: 3 });
var data = { /*----My JSON Object----*/ };
axios.post('my url', data, {
headers: {
'Authorization': 'API_Key',
'Content-Type': 'application/json'
}
})
.then(function(response){
console.log(response);
})
.catch(function(error){
console.log(error);
});
Use axios instead, it is a Promise based HTTP client for the browser and node.js
var axios = require('axios')
axios.post(url,data, {
headers: {
'authorization': your_token,
'Accept' : 'application/json',
'Content-Type': 'application/json'
}
}).then(response => {
// return response;
}).catch((error) => {
//return error;
});

How to use bearer token for authorization for POST method in sync-request?

How can we use bearer token with POST method using npm sync-request? The sync-request resource page has the way to use authorization in GET request but not in POST request.
*******GET Request*******
var request = require('sync-request');
var res = request('GET', 'https://example.com', {
'headers': {
'user-agent': 'example-user-agent'
}
});
****POST Request*****
var request = require('sync-request');
var res = request('POST', 'https://example.com/create-user', {
json: { username: 'Name' }
});
Not sure why you would want to use sync-request which can cause timing issues but this should work with either sync-request or request
// *******GET Request*******
var request = require('sync-request');
var res = request('GET', 'https://example.com', {
'headers': {
'user-agent': 'example-user-agent',
'authorization', 'Bearer ' + authId
}
});
// ****POST Request*****
var request = require('sync-request');
var res = request('POST', 'https://example.com/create-user', {
'headers': {
'authorization', 'Bearer ' + authId
},
json: { username: 'Name' }
});
authId needs to be whatever your bearer token spoils be for your app.
I would suggest use of axis and example below:-
GET
import axios from "axios";
axios({
method: 'get',
url: url,
headers: {
'Content-Type': 'application/json'
}
}).then(function (response) {
console.log(response);
}).catch((err) => {
console.log(err)
));
POST
axios({
method: 'post',
url: url,
data: JSON.stringify({orders}),
headers: {
'Content-Type': 'application/json',
'Authorization': userObj.token
}
}).then(function (response) {
console.log(response)
});
Where ubserObj.token -
Bearer Token ex: Bearer ASDF#!##!ADFASDF!##!##
This will be on the server side settings.

How to set raw post request for nodejs

I'm trying to send post request from nodejs, but unable to send through node. The request I have already tested on Postman,
Here is my Nodejs Code:
var rp = require('request-promise');
return rp({
url: Url,
method: "POST",
headers: {
"content-type": "application/x-www-form-urlencoded",
},
body: "Data=%3CSearchRequest%3E%0A%20%20%20%20%3CLoginDetails%3E%0A%20%20%20%20%20%20%20%20%3CLogin%3Etour%20booking%3C%2FLogin%3E%0A%20%20%20%20%20%20%20%20%3CPassword%3Exmltest%3C%2FPassword%3E%0A%20%20%20%20%3C%2FLoginDetails%3E%0A%20%20%20%20%3CSearchDetails%3E%0A%20%20%20%20%20%20%20%20%3CArrivalDate%3E2017-08-17%3C%2FArrivalDate%3E%0A%20%20%20%20%20%20%20%20%3CDuration%3E1%3C%2FDuration%3E%0A%20%20%20%20%20%20%20%20%3CRegionID%3E616%3C%2FRegionID%3E%0A%20%20%20%20%20%20%20%20%3CMealBasisID%3E0%3C%2FMealBasisID%3E%0A%20%20%20%20%20%20%20%20%3CMinStarRating%3E0%3C%2FMinStarRating%3E%0A%20%20%20%20%20%20%20%20%3CRoomRequests%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CRoomRequest%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CAdults%3E2%3C%2FAdults%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildren%3E2%3C%2FChildren%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CInfants%3E0%3C%2FInfants%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildAges%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CAge%3E8%3C%2FAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FChildAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CAge%3E8%3C%2FAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FChildAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FChildAges%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FRoomRequest%3E%0A%20%20%20%20%20%20%20%20%3C%2FRoomRequests%3E%0A%20%20%20%20%20%20%20%20%3CRoomRequests%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CRoomRequest%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CAdults%3E1%3C%2FAdults%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildren%3E0%3C%2FChildren%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CInfants%3E0%3C%2FInfants%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FRoomRequest%3E%0A%20%20%20%20%20%20%20%20%3C%2FRoomRequests%3E%0A%20%20%20%20%3C%2FSearchDetails%3E%0A%3C%2FSearchRequest%3E",
form: false,
}).then(function (body) {
console.log(body);
});
and here is my postman code:
POST /xml/book.aspx HTTP/1.1 Host: asmsajib.me Content-Type: application/x-www-form-urlencoded Cache-Control: no-cache Postman-Token: 9b9e6ea7-f7cb-f2a2-3fd7-5222cd9e0654 Data=%3CSearchRequest%3E%0A%20%20%20%20%3CLoginDetails%3E%0A%20%20%20%20%20%20%20%20%3CLogin%3Etour%20booking%3C%2FLogin%3E%0A%20%20%20%20%20%20%20%20%3CPassword%3Exmltest%3C%2FPassword%3E%0A%20%20%20%20%3C%2FLoginDetails%3E%0A%20%20%20%20%3CSearchDetails%3E%0A%20%20%20%20%20%20%20%20%3CArrivalDate%3E2017-08-17%3C%2FArrivalDate%3E%0A%20%20%20%20%20%20%20%20%3CDuration%3E1%3C%2FDuration%3E%0A%20%20%20%20%20%20%20%20%3CRegionID%3E616%3C%2FRegionID%3E%0A%20%20%20%20%20%20%20%20%3CMealBasisID%3E0%3C%2FMealBasisID%3E%0A%20%20%20%20%20%20%20%20%3CMinStarRating%3E0%3C%2FMinStarRating%3E%0A%20%20%20%20%20%20%20%20%3CRoomRequests%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CRoomRequest%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CAdults%3E2%3C%2FAdults%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildren%3E2%3C%2FChildren%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CInfants%3E0%3C%2FInfants%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildAges%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CAge%3E8%3C%2FAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FChildAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CAge%3E8%3C%2FAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FChildAge%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FChildAges%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FRoomRequest%3E%0A%20%20%20%20%20%20%20%20%3C%2FRoomRequests%3E%0A%20%20%20%20%20%20%20%20%3CRoomRequests%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3CRoomRequest%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CAdults%3E1%3C%2FAdults%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CChildren%3E0%3C%2FChildren%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3CInfants%3E0%3C%2FInfants%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2FRoomRequest%3E%0A%20%20%20%20%20%20%20%20%3C%2FRoomRequests%3E%0A%20%20%20%20%3C%2FSearchDetails%3E%0A%3C%2FSearchRequest%3E
You need to set Content-Length for the raw post to work and also I changed your headers to init caps.
rp({
url: Url,
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Content-Length": Buffer.byteLength(data) // your data
},
form: false
}).then(function (body) {
console.log(body);
}).catch((err) => {
console.log(err);
});

Resources