I have created the following code which grabs a seralizedXmlFile object from an S3 bucket and pushes it to a api service. This returns FAIL with the logs showing
Error: getaddrinfo ENOTFOUND http://url
at errnoException (dns.js:28:10)
at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:76:26)
CODE:
const AWS = require('aws-sdk');
const https = require('http');
var s3 = new AWS.S3();
var un;
var pw;
var seralizedXmlFile;
let index = function index(event, context, callback) {
//for testing I have named the bucket and key
var params = {
Bucket: "bucket", //event.bucketName,
Key: "personnelData_50112404_635705766849654385.xml" //event.fileName
};
s3.getObject(params, function(data, err)
{
if (data)
{
let seralizedXmlFile = err.Body.toString('utf-8'); // Use the encoding necessary
console.log("objectData " + seralizedXmlFile);
}
});
var ssm = new AWS.SSM({region: 'ap-southeast-2'});
var paramsx = {
'Names' : ['/App/ServiceUsername', '/App/ServicePassword'],
'WithDecryption' : true
};
ssm.getParameters(paramsx, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else {console.log('data: ' + JSON.stringify(data)); // successful response
console.log('password: ' + data.Parameters[0].Value);
console.log('username: ' + data.Parameters[1].Value);
pw = data.Parameters[0].Value;
un = data.Parameters[1].Value;
}
const req = https.request('http:/url/api/SyncPersonnelViaAwsApi/Get/5', (res) => {
res.headers + 'Authorization: Basic ' + un + ':' + pw;
let body = seralizedXmlFile;
console.log('Status:', res.statusCode);
console.log('Headers:', JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', (chunk) => body += chunk);
res.on('end', () => {
console.log('Successfully processed HTTPS response');
console.log('returned res: ' + res);
callback(null, res);
});
});
req.end();
});
};
exports.handler = index;
I followed a Q and A I found on AWS Lambda: Error: getaddrinfo ENOTFOUND
and changed the code to
var params = {
host: "http://URL",
path: "/api/SyncPersonnelViaAwsApi/Get/5"
};
var req = https.request(params, function(res) {
let data = '';
console.log('STATUS: ' + res.statusCode);
res.setEncoding('utf8');
res.on('data', function(chunk) {
data += chunk;
});
res.on('end', function() {
console.log("DONE");
console.log(JSON.parse(data));
but again firing the same error....does anyone have any idea what the issue is?
I have also tested the web service api through POSTMAN, so I can confirm it is working
Thank You
Try
host: "URL",
instead of
host: "http://URL",
Also, you're using the https library and your URL prefix is http:// but I think you can/should omit it altogether.
Error: getaddrinfo ENOTFOUND http://url
means client was not able to connect to given address. Please try specifying host without http:
var params = {
host: "URL",
path: "/api/SyncPersonnelViaAwsApi/Get/5"
};
Related
i have a little problem here, i want to make simple chat app using nodejs, but in terminal this error was come out, of course in web browser chat app doesn't work, this is my code
// # SimpleServer
//
// A simple chat server using Socket.IO, Express, and Async.
//
var http = require('http');
var path = require('path');
var async = require('async');
var socketio = require('socket.io');
var express = require('express');
//set this to your project URL
var c9server = 'http://sne.dlinkddns.com:8080/politan/writeData.php';
//ssl issues in c9
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
//
// ## SimpleServer `SimpleServer(obj)`
//
// Creates a new instance of SimpleServer with the following options:
// * `port` - The HTTP port to listen on. If `process.env.PORT` is set, _it overrides this value_.
//
var router = express();
var server = http.createServer(router);
var io = socketio.listen(server);
router.use(express.static(path.resolve(__dirname, 'client')));
var messages = [];
var sockets = [];
// create connection to file
// var fs = require('fs');
// var writeStream = fs.createWriteStream('log.json');
io.on('connection', function (socket) {
messages.forEach(function (data) {
socket.emit('message', data);
});
sockets.push(socket);
socket.on('disconnect', function () {
sockets.splice(sockets.indexOf(socket), 1);
updateRoster();
});
socket.on('message', function (msg) {
var text = String(msg || '');
if (!text)
return;
var d = new Date();
socket.get('name', function (err, name) {
var data = {
name: name,
text: text,
date: d
};
var trendData = {
date: d,
count: '1'
};
broadcast('message', data);
messages.push(data);
//log data
logData(data, 'messages.json');
logData(trendData, 'trend.json');
//write data to mysql
postData('data='+JSON.stringify(data), c9server);
});
});
socket.on('identify', function (name) {
socket.set('name', String(name || 'Anonymous'), function (err) {
updateRoster();
});
});
});
function updateRoster() {
async.map(
sockets,
function (socket, callback) {
socket.get('name', callback);
},
function (err, names) {
broadcast('roster', names);
}
);
}
function broadcast(event, data) {
sockets.forEach(function (socket) {
socket.emit(event, data);
});
}
function logData(data, file){
//setup file
var fs = require('fs');
//append the new data to the log
fs.appendFile(file, JSON.stringify(data)+"\n", function (err) {
if (err) throw err;
console.log(JSON.stringify(data) +' was appended to file!');
});
}
function postData(data, postUrl){
var request = require('request');
// Set the headers
var headers = {
'User-Agent': 'Super Agent/0.0.1',
'Content-Type': 'application/x-www-form-urlencoded'
}
// Configure the request
var options = {
url: postUrl,
method: 'POST',
headers: headers,
form: data
}
// Start the request
request(options, function (error, response, body) {
if (!error && response.statusCode == 200) {
// Print out the response body
console.log(body)
} else {
console.log(error);
}
})
}
// server.listen(process.env.PORT || 3000, process.env.IP || "0.0.0.0", function(){
server.listen(8081, process.env.IP, function(){
var addr = server.address();
console.log("Chat server listening at", addr.address + ":" + addr.port);
});
The error in console
Missing error handler on `socket`.
TypeError: undefined is not a function
at Socket.<anonymous> (/var/www/html/politan/server.js:89:14)
at Socket.emit (events.js:107:17)
at Socket.onevent (/var/www/html/politan/node_modules/socket.io/lib/socket.js:335:8)
at Socket.onpacket (/var/www/html/politan/node_modules/socket.io/lib/socket.js:295:12)
at Client.ondecoded (/var/www/html/politan/node_modules/socket.io/lib/client.js:193:14)
at Decoder.Emitter.emit (/var/www/html/politan/node_modules/component-emitter/index.js:134:20)
at Decoder.add (/var/www/html/politan/node_modules/socket.io-parser/index.js:247:12)
at Client.ondata (/var/www/html/politan/node_modules/socket.io/lib/client.js:175:18)
at Socket.emit (events.js:107:17)
at Socket.onPacket (/var/www/html/politan/node_modules/engine.io/lib/socket.js:101:14)
Glad if you can help my little project, thanks
Trying to hit the following http-auth code:
var auth = require("http-auth");
var basic = auth.basic({
realm: "Authentication required",
file: __dirname + "/../htpasswd"
});
http.createServer(basic, onRequest).listen(port);
The following is the code snippet that's hitting the above logic with request library of nodejs:
var request = require('request'),
username = "username",
password = "password",
url = "http://localhost:3000/",
auth = "Basic " + new Buffer(username + ":" + password).toString("base64");
request(
{
url : url,
headers : {
"Authorization" : auth
}
},
function (error, response, body) {
console.log("body "+body);
console.log("response "+response);
console.log("error "+error);
}
);
Output:
response : undefined
body : undefined
error : socket hang up
Stack trace:
events.js:141
throw er; // Unhandled 'error' event
^
Error: socket hang up
at createHangUpError (_http_client.js:203:15)
at Socket.socketOnEnd (_http_client.js:288:23)
at emitNone (events.js:72:20)
at Socket.emit (events.js:166:7)
at endReadableNT (_stream_readable.js:893:12)
at doNTCallback2 (node.js:429:9)
at process._tickCallback (node.js:343:17)
onRequest method:
module.exports.start = function(route, handle) {
function onRequest(request, response){
// response.write("welcome "+request.user+"!");
var pathname = url.parse(request.url).pathname;
route(handle, pathname, request, response);
}// on request ends here
onRequest is called from app.js like this:
var router = require("./lib/router.js");
var handle = {}
handle["/add"] = requestHandler.addMethod;
handle["/delete"] = requestHandler.deleteMethod;
handle["/edit"] = requestHandler.editMethod;
handle["/search"] = requestHandler.searchMethod;
console.log(router.route);
server.start(router.route, handle);
router.js
"use strict";
var url = require("url");
module.exports.route = function(handle, pathname, request, response) {
if(typeof handle[pathname] === 'function') {
handle[pathname](request, response);
} else {
console.log("no request handler found for "+pathname);
}// else ends here
}// route ends here
Method from the handler (requestHandler):
module.exports.addMethod = function (req, res) {
body = "";
req.on('data', function (chunk) {
body += chunk;
});
req.on('end', function () {
body = JSON.parse(body);
databaseConnection.collection("productList").insert(body, function(err,data) {
if(err){
res.writeHead(400, {"contentType":"application/JSON"});
var failedRes = JSON.stringify({
error : {
text : "Failed to add product"
}
});
res.end(faileRes);
return;
}// error handling
res.writeHead(200, {"Content-Type": "application/JSON"});
var finalId = data.ops[0]._id;
var successRes = JSON.stringify({
data: {
id : finalId
},
error : {
code : 0,
text : "Product added successfully"
}
});
res.end(successRes);
});
})
}
The error occurs because of a JSON.parse error on the server. The body object is a string but it is not a valid JSON string. This causes the line:
JSON.parse(body);
to throw an error on the server (if not data was sent):
SyntaxError: Unexpected end of input
at Object.parse (native)
or, if data was sent:
SyntaxError: Unexpected token ...
at Object.parse (native)
Either of these errors cause the server to crash and, consequently, the client to report the socket hang up error.
To resolve this, you'll need to send the data to the server as JSON. To do this with the request module:
request.post(url, {
headers: {
"Authorization" : auth
},
json: {
message: 'Hello'
}
}, function (error, response, body) {
console.log("body "+body);
console.log("response "+response);
console.log("error "+error);
});
I just started working with Nodejs.
I am using Restify to get data from: http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo'.
My code below gives me an error: {"code":"ResourceNotFound","message":"/ does not exist"}
var restify =require("restify");
var server = restify.createServer();
server.use(restify.acceptParser(server.acceptable));
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.get('http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo', function (req, res) {
console.log(req.body);
res.send(200,req.body);
});
server.listen(7000, function () {
console.log('listening at 7000');
});
That's because Restify is for creating REST endpoints, not consuming them. You should check out this SO post for help consuming data from an API.
e.g. create test.js with the following:
var http = require('http');
var options = {
host: 'api.geonames.org',
path: '/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo'
};
var req = http.get(options, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
// Buffer the body entirely for processing as a whole.
var bodyChunks = [];
res.on('data', function(chunk) {
// You can process streamed parts here...
bodyChunks.push(chunk);
}).on('end', function() {
var body = Buffer.concat(bodyChunks);
console.log('BODY: ' + body);
// ...and/or process the entire body here.
})
});
req.on('error', function(e) {
console.log('ERROR: ' + e.message);
});
then run node test.js.
I found what I was looking for. You can use restify client to get JSON data:
Here is my solution:
var restify = require("restify");
function getJSONDataFromUrl(){
var query = "?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo";
var options = {};
options.url = "http://api.geonames.org";
options.type = options.type || "json";
options.path = "/citiesJSON" + query;
options.headers = {Accept: "application/json"};
var client = restify.createClient(options);
client.get(options, function(err, req, res, data) {
if (err) {
console.log(err);
return;
}
client.close();
console.log(JSON.stringify(data));
return JSON.stringify(data);
});
}
getJSONDataFromUrl();
I'm writing a pretty basic HTTP request using SailsJS. I'm getting the data I want from the api that I'm calling, but I can't figure out how to pass it from my service back to the controller and eventually respond to the request with the data in the body.
Here's my controller:
module.exports = {
retrieve: function(req, res) {
var output = AccountService.retrieveAccountInfo();
console.log(output);
return res.send(output);
}
}
And here is my service that I'm calling.
module.exports = {
retrieveAccountInfo: function() {
var http = require('http');
var options = {
host: 'localhost',
port: 8280,
path: '/sample/account?id=1',
method: 'GET',
headers: {
'sample': 'header'
}
};
var req = http.request(options, function(res) {
var data = '';
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers) + '\n\n');
res.setEncoding('utf8');
res.on('data', function(chunk) {
console.log('BODY: ' + chunk);
data += chunk;
});
res.on('end', function() {
console.log('hit the end');
return JSON.stringify(data);
});
});
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
req.end();
}
}
I'm probably missing some basic JavaScript stuff here. I can get to the end callback and print "hit the end" as expected, but I can't get the data returned to the controller.
the method you're using in your service is an asynchronous method, you can modify them like following
module.exports = {
retrieve: function(req, res) {
AccountService.retrieveAccountInfo(function(error, output) {
console.log(output);
return res.send(output);
});
}
}
service - use callback method
module.exports = {
retrieveAccountInfo: function(callback) {
var http = require('http');
//.....
res.on('end', function() {
console.log('hit the end');
callback(null, JSON.stringify(data));
});
//.....
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
callback(e); //error
});
req.end();
}
}
I have got some error when use http.request to make a client request(node v0.6.18, v0.6.3), the following code produces the error and I have some questions.
var http = require('http');
var url = require('url');
http.createServer(function(req, res) {
var data = '多情自古空余恨';
res.writeHead(200, {
'Content-Type': 'text/plain',
'Content-Length': 1 //ERROR
});
res.end(data);
}).listen(3000);
function request(options, callback) {
var req = http.request(options, function(res) {
var data = '';
res.setEncoding = 'utf8';
res.on('data', function(chunk) {
data += chunk;
});
res.on('error', function(err) {
callback(new Error('res error: ' + err));
});
res.on('end', function() {
console.log('res on end');
callback(null, data);
});
});
req.on('socket', function(socket) {
socket.on('error', function(err) {
console.log('socket on error');
callback('socket error: ' + err);
req.abort();
});
});
req.end();
}
request({
host: 'localhost',
port: 3000,
method: 'GET'
}, function(err, data) {
console.log('result, err: ' + err + ', data: ' + data);
});
Outputs:
res on end
result, err: null, data: �
socket on error
result, err: socket error: Error: Parse Error, data: undefined
Here are my questions:
Why res's 'end' event happened earlier than socket's 'error' event?
If I do want to callback an error when "Parse Error at Socket.ondata" happens like the above code or in any other situation, how to callback once instead of twice as the above output(IF res's 'end' event really hanppened earlier than socket's 'error' event)?
I need your help! Thanks.
===============================
I found the same code outputs:
res on end
result, err: null, data: �
in node v0.6.6 and v0.6.11. Why?
Because there's a content-length header of 1, when the request receives exactly 1 octet of data, it assumes that's all there is and fires the end callback. After that, more data is received that the socket doesn't know what to do with, so it fires the error.
To work around this, you could perhaps wait a short period before firing the callback for success and track if it's been fired. For example:
var req = http.request(options, function(res) {
var data = '';
res.setEncoding = 'utf8';
res.on('data', function(chunk) {
data += chunk;
});
res.on('error', function(err) {
if(!callback.called) { // check before firing the callback
callback(new Error('res error: ' + err));
callback.called = true; // set after firing the callback
} // ..
});
res.on('end', function() {
process.nextTick(function() { // use setTimeout if nextTick is too short
if(!callback.called) { //..
console.log('res on end');
callback(null, data);
callback.called = true; // ..
} // ..
}); // ..
});
});
req.on('socket', function(socket) {
socket.on('error', function(err) {
if(!callback.called) { // ..
console.log('socket on error');
callback('socket error: ' + err);
callback.called = true; // ..
} // ..
req.abort();
});
});
req.end();
(I tried to add comments after all of the new lines to make them stand out a little.)