What is wrong with this restify client code? - javascript

I have a server URL like this;
http://127.0.0.1:8888/stk?list=XXX,YYY
The server URL is tested to be working. I have a restify client that makes a HTTP GET to this URL and if things are working, a json output will be returned.
This is how the restify client code looks like;
var restify = require('restify');
var client = restify.createClient({
url: 'http://127.0.0.1:8888'
});
client.get('/stk?list=XXX,YYY', function(err, req) {
assert.ifError(err); // connection error
req.on('result', function(err, res) {
assert.ifError(err); // HTTP status code >= 400
res.body = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
res.body += chunk;
});
res.on('end', function() {
console.log(res.body);
});
});
});
The error was at assert.ifError(err); because err was null.
What is wrong with the code?

Related

How to make an HTTP/HTTPS request within a Node.js server?

I'm just starting to learn Node.js and right now, I'm trying to use a Node.js Application through cPanel to provide a JSON response when its app's URL is accessed.
When visiting the app's URL, it's evident that the Node.js server is working as it should. So after editing the main JS file, and restarting the Node.js app, changes are reflected when visiting the URL again.
My problem:
Within the function of https.createServer( function (req, res) {});, I want to make an HTTPS request to a PHP file elsewhere, which returns a JSON response. At the moment, I can't even get a response or error from any type of request with the PHP file.
var https = require('https');
var server = https.createServer(function (req, res) {
var message = "";
res.writeHead(200, {
'Content-Type': 'text/plain'
});
var options = {
host: "mydomain.com",
path: '/myPhpScript.php'
};
https.get(options, function(res) {
var bodyChunks = [];
res.on('data', function(chunk) {
bodyChunks.push(chunk);
}).on('end', function() {
var body = Buffer.concat(bodyChunks);
message += body;
})
}).on('error', function(e) {
message += e;
});
res.end(message);
});
server.listen();
As you can see, message would be what's displayed to the browser window, but it's empty. Nothing appears when visiting the App URL. Is it possible to make an HTTPS request with a Node.js HTTPS server?
Note:
I've also tried with native-request and axios and have experienced the same issue.
Server code:
var http = require('http');
var https = require("https");
var server = http.createServer(function (req, res) {
let call = new Promise((resolve, reject) => {
var options = {
host: "jarrenmorris.com",
port: 443,
path: '/gamesense/r6_db/1.json'
};
https.get(options, function (res) {
var bodyChunks = [];
res.on('data', function (chunk) {
bodyChunks.push(chunk);
}).on('end', function () {
resolve(Buffer.concat(bodyChunks));
});
}).on('error', function (e) {
reject(e);
});
});
call.then((data) => {
// do something here with the successful request/json
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end(data);
}).catch((err) => {
// do something here with the failure request/json
// res.write("ERROR:");
res.end(err);
});
});
server.listen(8081, "127.0.0.1", () => {
console.log(`Server listen on ${server.address().address}:${server.address().port} `);
});
Response:
{"name":"tim","age":"42"}
First thing i noticed, while i tried to run your code was, you cant establish a connection to your node.js.
The reason for this was you use the https module, but didnt specify an certificates/keyfiles. Skip this, and work with http till you get the result you want.
Then i wrapped you https request to the external api/file in a promise.
This allows a simple chaining and better readability of the code.
When the promises resolves/fullfill, we answer the request on the http server with the data we received from the external request.
The res.end in your code (where you put it) made no sense, since you didnt wait for the external request to complete. Thats the reason why its nothing is shown in the browser window.

Node Js as server http to consume external web service

I want to install Node Js to consume a external web service in SOAP.
This is the architecture:
|Webshere application| ---HTTP---> |Node Js| ----HTTPS--> ||External Web Service||
This is the script I am doing:
var http = require('http');
var httpntlm = require('httpntlm');
var options = {
url: "https://serverexterno/WebServiceSOAP?wsdl"
}
const server = http.createServer( (req, res) => {
let body = '';
let headers = req.headers
let as400Response ='';
req.setEncoding('ascii');
req.on('data', (chunk) => {
body += chunk;
});
httpntlm.post(options,
function (err, resp) {
console.log (resp);
if(err) {
return console.log(err);
}
console.log( resp.headers);
console.log("resp.body" + resp.body);
body = resp.body;
res.statusCode = 200;
return res.end(resp.body);
});
console.log ('Finish ....');
} catch (er) {
res.statusCode = 400;
return res.end(`error: ${er.message}`);
}
});
});
server.listen(8084, function(){
console.log("Server listening on: http://localhost:%s", 8087);
});
However, I don't receive as expected. I receive the message in html with the message "Hello! This is an Axis2 Web Service!". It seems like the webservice is not executing.
Can someone help me why get this error?

http request get body

I am a beginner with node so excuse me if this question is too obvious. Also I tried the official documentation but I could resolve this problem.
My node server is communicating with an external api through a service.
This is what I ve got so far in my service api-service.js :
var http = require('http');
exports.searchNear = function(lat, long, next){
var options = {
host: '1xx.xx.1xx.1x',
path: '/api/v1/geo,
method: 'GET'
};
var req = http.request(options, function(res) {
var msg = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
msg += chunk;
});
res.on('end', function() {
console.log(JSON.parse(msg));
});
});
req.on('error', function(err) {
// Handle error
});
req.write('data');
req.end();
var mis = 'hello';
next(null, mis);
}
At this moment I can get the Json and log it in the console. But I want to store the returned json in a variable so I could pass in the next() callback.
I tried to add a callback to the end event like:
exports.searchNear = function(lat, long, next){
....
.....
var req = http.request(options, function(res) {
.....
res.on('end', function(callback) {
console.log(JSON.parse(msg));
callback(msg);
});
});
....
req.end('', function(red){
console.log(red);
});
}
Thank you in advance.
The callback's name in your code should be "next":
var http = require('http');
exports.searchNear = function(lat, long, next) {
var options = {
host: '1xx.xx.1xx.1x',
path: '/api/v1/geo,
method: 'GET'
};
var req = http.request(options, function(res) {
var msg = '';
res.setEncoding('utf8');
res.on('data', function(chunk) {
msg += chunk;
});
res.on('end', function() {
console.log(JSON.parse(msg));
next(null, msg);
});
});
req.on('error', function(err) {
// Handle error
});
req.write('data');
req.end();
}
And then you should use your function like this:
searchNear(myLong, myLat, function (err, mesg) {
console.log('your JSON: ', mesg)
});
I may be misunderstanding your question but the obvious solution is to store your parsed json in a variable and pass the variable to next()
var parsed = JSON.parse(msg);

Node JS OR Express JS HTTP GET Request

I am using express.js and I need to make a call to HTTP GET request ,to fetch JSON data .Please suggest me some good node js/express js modules/lib to perform get/post request .
Node.js provides an extremely simple API for this functionality in the form of http.request.
var http = require('http');
//The url we want is: 'www.random.com/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
var options = {
host: 'www.random.com',
path: '/integers/?num=1&min=1&max=10&col=1&base=10&format=plain&rnd=new'
};
callback = function(response) {
var str = '';
//another chunk of data has been recieved, so append it to `str`
response.on('data', function (chunk) {
str += chunk;
});
//the whole response has been recieved, so we just print it out here
response.on('end', function () {
console.log(str);
});
}
http.request(options, callback).end();
Here I attach some more examples with POST and custom headers. If you don't need special things, I'd stick to the native code.
Besides, Request, Superagent or Requestify are pretty good libraries to use.
var express = require('express');
var app = express();
var fs = require('fs');
app.get('/', function (req, res) {
fs.readFile('./test.json', 'utf8', function (err, data) {
if (err) {
res.send({error: err});
}
res.send(data);
})
});
var server = app.listen(3001, function () {
console.log('Example app listening port 3001');
});

HTTP Request in Node Js

I know how http request works and I know how to send and receive response.
This is the sample code of http request.
var http = require('http');
var options = {
host: 'www.nodejitsu.com',
path: '/',
port: '1337',
method: 'POST'
};
callback = function(response) {
var str = ''
response.on('data', function (chunk) {
str += chunk;
});
response.on('end', function () {
console.log(str);
});
}
var req = http.request(options, callback);
req.write("hello world!");
req.end();
In my site everything working fine Server B send request to server A and server A response to server B. But, one time I face a problem when there is huge no of traffic on server A and it was unable to receive any request from server B which halt the whole process.
So is there is any error block in request to handle this type of errors ?
I googled alot and try this type of foolish things but it does not work for me
callback = function(response,error) {
if(error){
console.log(error)
}else{
var str = ''
response.on('data', function (chunk) {
str += chunk;
});
response.on('error', function (err) {
console.log(err);
});
}
});
Have you tried this:
var req = http.request(options,callback);
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
as given here:
http://nodejs.org/api/http.html#http_http_request_options_callback

Categories

Resources