Trigger a test http request - node.js

For unit testing purposes I want to trigger a fake http request in expressjs to my routes to test how each respond. Is there an easy way to do this?

Trigger a real request. it will not use any bandwidth since its on the same machine
var options = {
hostname: 'example.com',
path: '/test'
};
http.request(options).end();

Request.js is the most common way to send requests with node.
var request = require('request');
request('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Print the google web page.
}
})

Related

How to always add prefix to url in Node.js request

I'm using the package "request" (https://www.npmjs.com/package/request) in Node.js. What I want to have is somehow like the "defaults" api, that I give a default url prefix to the request object, the url of any request which sent from my request object will be prefixed before sending. Is that possible? Thank you!
You can use request.defaults
const request = require('request');
const baseRequest = request.defaults({baseUrl : 'https://example.com/api/'}})
now use baseRequest object
Documentation Link-
Request.defaults
You can create a default request instance, in there config you baseUrl
var request = require('request');
var r = request.defaults({
baseUrl: 'https://example.com/api/',
})
r({
'url':'/end/point?test=true',
'method': "GET",
},function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
}); // will fetch https://example.com/api/end/point?test=true

Nodejs Capture response from API call

I am new to node js. I am trying to call an API that will give me a URL, then I will use this URL to do a number of things like send an SMS, email, insert to mySql DB.
API call is working fine, when I log the URL inside request block (see code commented with WORKING FINE)
But when I try to log the URL outside the request block, it does not work. (See code commented with NOT WORKING FINE). This where I want to do all the things with URL.
Please help. Thanks
var body =
{
"mobile": Mobile,
"policy": Policy_number,
"name": Policy_Holder_Name,
"docs": Docs_Pending,
"target": 'mobile'
};
var options =
{
uri: BaseURL,
method: 'POST',
headers: header,
json: body
};
var URL = '';
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
URL = response.body.url;
console.log(URL); //WORKING FINE
}
});
console.log(URL); //NOT WORKING FINE
As the others state your problem is in the order in which your code executes.
The call to request declares a function on-the-fly (called a lambda function) which will only be executed once the response is received. Execution will then continue through to the end and THEN run that function.
I've commented the code below to try and explain.
/**THIS CODE IS RUN FIRST**/
var body = {
"mobile": Mobile,
"policy": Policy_number,
"name": Policy_Holder_Name,
"docs": Docs_Pending,
"target": 'mobile'
};
var options = {
uri: BaseURL,
method: 'POST',
headers: header,
json: body
};
var URL = '';
/**DECLARES A FUNCTION BUT IS NOT RUN UNTIL THE REQUEST COMPLETES**/
request(options, function (error, response, body) {
/**THIS CODE RUNS LAST**/
if (!error && response.statusCode == 200) {
URL = response.body.url;
console.log(URL); //WORKING FINE
}
});
/**RUNS SECOND - URL IS STILL NOT DEFINED**/
console.log(URL); //NOT WORKING FINE
If you want some later code to be run, then the best pattern may be to put it in a function.
request(options, function (error, response, body) {
/**THIS CODE RUNS LAST**/
if (!error && response.statusCode == 200) {
doMoreStuff(response.body.url);
}
});
function doMoreStuff(URL){
console.log(URL);
}
Your request is asyncronous that's why this thing is happening I would suggest you to use async waterfall refer this -
https://caolan.github.io/async/docs.html#waterfall
default value for URL is '' ,
now make http request and if you will get response code 200 , means you successfully got response and URL is not '' ,
Nodejs works asynchronous in nature , so console.log(URL); may be executed before you make http request to api , so it will print ' ' in console.
so it is better to access variable URL inside request's response
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
URL = response.body.url;
console.log(URL); //WORKING FINE
}
});
yes you can access URL outside , but you need to wait until your request is completed
for example , wait for 10 second and print URL in console like this :
setTimeout(function(){ console.log(URL)}, 10000);
use AsyncJS for asynchronous operations .

Node.JS make multiple POST requests untill response is empty

I'm making a POST request to API that has limited number of characters in response. In order to get full response I need to make multiple POST requests and then append them all to one file. I'm not that familiar with asynchronous programming so I can't think of a solution for my problem. Here is snippet of my code:
var request = require('request');
var fs = require('fs');
var options = {//options for POST request body};
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
fs.appendFileSync("./response.json", JSON.stringify(body), 'utf8');
var resp = JSON.parse(fs.readFileSync('./response.json', 'utf8'));
options.offset = resp.parameters.length; //this is length of my data so far, next request will have this number in it and response will be new data offseted by this number
}
});
And after this request I need to make another one untill body.length is zero. So I guess what I need is to call request function from its own callback. How do I achieve this? Thanks!
Like JM-AGMS said, wrap the request function call in another function to have the callback of one request trigger the next request.
A recursive solution would look somewhat like this:
var request = require('request');
var fs = require('fs');
var options = {/*options for POST request body*/};
function loop(options) {
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
if (body.length !== 0) {
fs.appendFileSync("./response.json", JSON.stringify(body), 'utf8');
var resp = JSON.parse(fs.readFileSync('./response.json', 'utf8'));
loop({ ...options, offset: resp.parameters.length });
}
}
});
}

Consuming a service API using nodejs + jsonwebtoken(jwt)

Hello guys i want to use node.js to retrieve the user authenticated from an api URL.
I retrieved the codeToken(jsonwebtoken) and put it in the header of my request in postman it works.
But when i go to the code i can't find a way to use node.js+express request, to retrieve the json response of the user that's logged in using all that.
i can't put the url of the API in the sake of the client.
here is my code guys but it's not the right one please advise
var request = require('request');
var options = {
url: '**********',//for the sake of client hidden
headers: {
tokenCode: '15288648455b20a04d5463e'
}
};
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
var info = JSON.parse(body);
console.log(info);
}else
//console.log(response );
console.log(response.statusCode);
}
request(options, callback);
Headers in my POSTMAN (only tokenCode)

Insert data through SPARQL over HTTP POST request from node js

I am using 'request' module in my node app to POST data in ontology model which resides in a fuseki server. I am using the following code:
var request = require('request');
var querystring = require('querystring');
var myquery = querystring.stringify({update: "PREFIX test:<http://www.semanticweb.org/muhammad/ontologies/2017/2/untitled-ontology-14#> INSERT { ?KPIs test:hasValue 2009} WHERE { ?KPIs test:hasValue ?Newvalue}"});
request.post('http://localhost:3030/DS-1/sparql?'+myquery, function (error, response, body) {
if (!error && response.statusCode == 200) {
// Show the HTML for the Google homepage.
console.log('successful update');
console.log(body);
} else {
console.log(response.statusCode);
console.warn(error);
}
});
PS: When I use POSTMAN to send the Post request to insert data it works fine but from my node app, it doesn't. it shows error 'bad request 400'.
P.S: GET methods work fine from both POSTMAN and node app.
Problem Solved:
I was making mistake in the format of post request. The corrected format is given below.
var request = require('request');
var querystring = require('querystring');
var myquery2 = querystring.stringify({update: "PREFIX test:<http://www.semanticweb.org/muhammad/ontologies/2017/2/untitled-ontology-14#> INSERT { ?KPI_Variables test:hasValue_ROB1 2000} WHERE { ?KPI_Variables test:hasValue_ROB1 ?Newvalue FILTER(?KPI_Variables= test:Actual_Production_Time)}"});
request.post({headers: {'content-type' : 'application/x-www-form-urlencoded'},url:'http://localhost:3030/DS-1/?'+myquery2 }, function (error, response, body) {
if (!error && response.statusCode == 200) {
// Show the HTML for the Google homepage.
console.log('successful update');
console.log(body);
}
else
{
console.log(response.statusCode)
console.warn(error);
}
});
I was missing the 'headers' and 'url' elements in my request.post.
/DS-1/sparql is the query service.
INSERT is an update operation.
Try /DS-1/update
It is better to POST the update in the body of the request with a Content-type. ?update= may not work.

Resources