How to pass arguments in express.js - node.js

kind of a noob question, hopefully someone can help me with.
I am making an application which uses express.js to communicate with bitcoin-core by sending http reqests.
router.get("/getbalance", (req, res) => {
var dataString = `{"jsonrpc":"1.0","id":"curltext","method":"getbalance","params":[]}`;
var options = {
url: `http://${USER}:${PASS}#127.0.0.1:18443/`,
method: "POST",
headers: headers,
body: dataString
};
callback = (error, response, body) => {
if (!error && response.statusCode == 200) {
const data = JSON.parse(body);
res.send(data);
}
};
request(options, callback);
So far it is working quite well, and the problem arises when i try to pass more than one argument to the request, e.g., when i try to send bitcoin to an address in the console, the command is:
bitcoin-cli -regtest sendtoaddress [someaddress] [amount]
i tried to do it like this:
http://localhost:4444/api/sendtoaddress/bcrt1q3nczv7jr88rwvhsyv2rx49l3czfxurzfk240ue/10
but it just freezes.
This is what the "sendtoaddress" request looks like so far.
router.get("/sendtoaddress/:addr/:amount", (req, res) => {
var dataString = `{"jsonrpc": "1.0", "id": "curltext", "method": "sendtoaddress", "params": [${req.params.addr}, ${req.params.amount}]}`
console.log(req.params.addr)
var options = {
url: `http://${USER}:${PASS}#127.0.0.1:18443/`,
method: "POST",
headers: headers,
body: dataString
};
callback = (error, response, body) => {
if (!error && response.statusCode == 200) {
const data = JSON.parse(body);
res.send(data);
}
};
request(options, callback);

As I'm a new contributor so can't create a comment.
it would be better if u could use query method to get the data from the url.
A basic get url would look like this:
"https://xyc.com/vehicle?name="abc"&color="color"
query method is used to get the fields after the ?
We use req.params to get the :id from the url.
you can try changing your get url from this:
"/sendtoaddress/:addr/:amount"
to this:
"/sendtoaddress/:addr?amount="some_amount"
I hope this helps.

Related

Pass post data to another url and get url response in post response

I am trying to pass some data to /card then filter it and send to a url and the final response of my /card need to be response send from the url.
app.post('/card', (req, res) => {
var testData = req.body.orderId;
if(testData!=null){
var options = {
uri: 'https://localhost',
headers: {'content-type' : 'application/json'},
method: 'POST',
json: {"longUrl": testData}
};
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// res.json(testData);
console.log(body.id) // Print the shortened url.
}
});
}
});
You can use Node.js core module http to make an http request from within your Node application.
You can consult the official documentation and various options here https://nodejs.org/api/http.html#http_http_request_options_callback

How to use query paramaters for spotify api using node.js?

var queryparam = "track:godsplan%20artist:drake&type=track&market=US&limit=10";
app.get('/get_track', function(req,res){
var options = {
url:"https://api.spotify.com/v1/search?"+queryparam,
headers: { 'Authorization': 'Bearer ' + access_token },
json: true
}
request.get(options, function(error, response, body) {
if(!error && response.statusCode === 200) {
console.log(body);
}
else{
console.log(error);
console.log(response.statusCode);
}
res.redirect('/#');
});
});
here is what I have and i am trying to get god's plan by drake to appear on my console when I run the server on local host and my access_token works but whenever i run the "/get_track" i get a bad request error, does anyone know why?
Your missing q=
var queryparam = "q=track:godsplan%20artist:drake&type=track&market=US&limit=10";
https://developer.spotify.com/documentation/web-api/reference/search/search/#request-parameters
what is that module "request" ?
(http, request-promise, request)
although I suppose that your request is simply not correctly formed
you need to try:
var queryparam = "q=track:godsplan%20artist:drake&type=track&market=US&limit=10";

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 .

Send unparsed data in a Node JS request

I want to send a POST request (for example, with the 'request' module), but I don't find a way of sending unparsed data*.
*unparsed data => copied directly from the Chrome dev tool. Something like: tipo_accion=3&filtro=descarga&fecha=actual
It would also do the trick some way of translating that string to JSON.
I've tried so far with...
var request = require('request');
request.post({ url: 'https://target.com/form/', form: 'tipo_accion=3&filtro=descarga&fecha=actual' },
function (error, response, body) {
console.log(body)
}
);
... but it didn't work.
Firstly you should understand the difference between the request methods post and get.
The structure that you want to send:
tipo_accion=3&filtro=descarga&fecha=actual is telling me that you want to use a get request. So the proper code for that will be something like:
request(
'https://target.com/form/&tipo_accion=3&filtro=descarga&fecha=actual',
function (error, response, body) {
console.log(body)
},
);
But if it is a post request then you should use the json format
request.post({
url: 'https://target.com/form/', form: {
tipo_accion: 3,
filtro: 'descarga',
fecha: 'actual'
},
function(error, response, body) {
console.log(body)
}
);
You can convert form_data to string format and it works for me you can try it :
const request = require('request-promise');
var j = request.jar()
var data_fom = `a=value_a&b=value_b&c=value_c`
request({
url:"https://target.com/form/",
jar:j,
method:"POST",
resolveWithFullResponse: true,
form:data_form
})

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