Nuxt.js socket hang up on axios get only on https not http server - axios

I'm using Nuxt 2.8.1, Axios Module (https://axios.nuxtjs.org).
I followed up this guide https://nuxtjs.org/faq/http-proxy/ to solve CORS problems on Firefox/IE, but ended up NuxtServerError: socket hang up on every proxied request if I ENABLE server https option in nuxt.config.js, not if I disable.
I tried adding rejectUnauthorized: false to server https param, wrote an express server to handle the SSL certificate and render using Nuxt,... but still can't solve the problem.
This is my nuxt.config.js:
env: {
API_HOST: 'https://api.mywebsite.com',
BASE_URL: process.env.BASE_URL || 'http://localhost:3000',
},
axios: {
proxy: true,
},
proxy: {
'/api/': {
target: 'https://api.mywebsite.com/api',
pathRewrite: {'/api': ''},
credentials: false,
}
},
server: {
port: 3000,
https: {
rejectUnauthorized: false,
key: fs.readFileSync('../privkey.pem'),
cert: fs.readFileSync('../fullchain.pem')
}
}
It works well if i just remove whole https param in 'server'. Here is my axios call on store/index.js:
export const actions = {
async nuxtServerInit ( { commit } ) {
const { data } = await this.$axios.get('/api/option');
let options = {};
data.forEach(item => {
options[item.Name] = item.Value;
});
commit('setOptions', options)
},
}
This is my console log on that axios call:
Promise { 18:04:38
<rejected> [Error: socket hang up] {
at createHangUpError (_http_client.js:323:15)
at Socket.socketOnEnd (_http_client.js:426:23)
at Socket.emit (events.js:203:15)
at Socket.EventEmitter.emit (domain.js:448:20)
at endReadableNT (_stream_readable.js:1129:12)
at process._tickCallback (internal/process/next_tick.js:63:19)
code: 'ECONNRESET',
config: {
url: 'http://localhost:3000/api/option',
method: 'get',
headers: [Object],
baseURL: 'http://localhost:3000/',
transformRequest: [Array],
transformResponse: [Array],
timeout: 0,
adapter: [Function: httpAdapter],
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
validateStatus: [Function: validateStatus],
data: undefined
},
request: Writable {
_writableState: [WritableState],
writable: true,
domain: null,
_events: [Object],
_eventsCount: 2,
_maxListeners: undefined,
_options: [Object],
_redirectCount: 0,
_redirects: [],
_requestBodyLength: 0,
_requestBodyBuffers: [],
_onNativeResponse: [Function],
_currentRequest: [ClientRequest],
_currentUrl: 'http://localhost:3000/api/option'
},
response: undefined,
isAxiosError: true,
toJSON: [Function]
}
}
I would appreciate any help :)

I tried to use as many options as I thought was relevant in the proxy module, but ended up nowhere. I think you should create an issue on either #nuxtjs/proxy or on http-proxy-middleware github.
On my end the proxy route works without a problem with Vue's normal lifecycles, but will end up with a socket hang up when placed in asyncData or fetch - so I assume it's a SSR issue.
I don't have any problems with CORS, so I ended up creating module clones of the axios-module with custom prototypes. This setup unfortunately doesn't work alongside the axios-module as that also creates a socket hangup regardless of whether I have a proxy setup.

https://stackoverflow.com/a/43439886/1989083
I fixed my same issue by adding these lines into axios.js:
delete process.env['http_proxy'];
delete process.env['HTTP_PROXY'];
delete process.env['https_proxy'];
delete process.env['HTTPS_PROXY'];

Related

Can make post request to localhost using node-fetch, but unable to do so using Axios

I have tried making the same post request using node-fetch and axios.
var fetch = require('node-fetch');
var axios = require('axios');
async function fetchTest(host, port, body) {
const response = {
successMessage: '',
errorMessage: ''
}
try {
const streamResponse = await fetch(`${host}:${port}`, {
method: 'post',
body: JSON.stringify(body)
})
const jsonResponse = await streamResponse.json()
response.successMessage = jsonResponse;
} catch (error) {
response.errorMessage = error;
}
return response;
}
async function axiosTest(host, port, body) {
const response = {
successMessage: '',
errorMessage: ''
}
try {
const jsonResponse = await axios({
method: 'post',
url: `${host}:${port}`,
data: body
})
response.successMessage = jsonResponse;
} catch (error) {
response.errorMessage = error;
}
return response;
}
async function test() {
console.log(await fetchTest('http://127.0.0.1', '8801', { type: 'request', cmd: 'devices' }));
console.log(await axiosTest('http://127.0.0.1', '8801', { type: 'request', cmd: 'devices' }));
}
test();
The request made with node-fetch works nicely. The request made with axios returns (IP address redacted with ...) an error:
{ successMessage: '',
errorMessage:
{ Error: connect ECONNREFUSED ...:80
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1161:14)
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: '...',
port: 80,
config:
{ adapter: [Function: httpAdapter],
transformRequest: [Object],
transformResponse: [Object],
timeout: 0,
xsrfCookieName: 'XSRF-TOKEN',
xsrfHeaderName: 'X-XSRF-TOKEN',
maxContentLength: -1,
validateStatus: [Function: validateStatus],
headers: [Object],
method: 'post',
url: 'http://127.0.0.1:8801',
data: '{"type":"request","cmd":"devices"}' },
request:
Writable {
_writableState: [WritableState],
writable: true,
_events: [Object],
_eventsCount: 2,
_maxListeners: undefined,
_options: [Object],
_redirectCount: 1,
_redirects: [],
_requestBodyLength: 39,
_requestBodyBuffers: [],
_onNativeResponse: [Function],
_currentRequest: [ClientRequest],
_currentUrl: 'http://.../',
_isRedirect: true },
response: undefined } }
What might be the reason? Am I doing something wrong?
EDITED with more info requested in comment:
The axios request fails the same way if I comment out the node-fetch request.
The node-fetch request returns:
{
cmd: 'devices',
payload: { devices: [Array] },
type: 'response' },
}
Since I wrap the result in a response object, the console.log looks like
{
successMessage:
{
cmd: 'devices',
payload: { devices: [Array] },
type: 'response'
},
errorMessage: ''
}

how can I get other db instance in nodejs 3.0 mongo-client?

I used mongo-nodejs 2.2 and upgraded to 3.0. After upgrading, I found that the method db() in Db class doesn't exist anymore (http://mongodb.github.io/node-mongodb-native/3.0/api/Db.html). This method is very useful to switch to different database instance. I wonder how I can switch to different database with the latest version.
Okay so it is gone, and it's documented as gone and the real message is you should be using Mongoclient.prototype.db instead:
From the 3.0 Changes:
We removed the following API methods.
Db.prototype.authenticate
Db.prototype.logout
Db.prototype.open
Db.prototype.db
...
We've added the following API methods.
MongoClient.prototype.logout
MongoClient.prototype.isConnected
MongoClient.prototype.db
The basic lesson here was wherever you were using Db directly, you should be using the MongoClient instance instead. This is obtained from the very first connection:
const { MongoClient } = require('mongodb');
(async function() {
try {
const conn = await MongoClient.connect('mongodb://localhost');
let test = conn.db('test');
let admin = test.admin();
console.log(admin);
let another = conn.db('another');
console.log(another);
} catch(e) {
console.error(e);
} finally {
process.exit();
}
})()
Returns output like:
Admin {
s:
{ db:
Db {
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
s: [Object],
serverConfig: [Getter],
bufferMaxEntries: [Getter],
databaseName: [Getter] },
topology:
Server {
domain: null,
_events: [Object],
_eventsCount: 25,
_maxListeners: Infinity,
clientInfo: [Object],
s: [Object] },
promiseLibrary: [Function: Promise] } }
Db {
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
s:
{ databaseName: 'another',
dbCache: {},
children: [],
topology:
Server {
domain: null,
_events: [Object],
_eventsCount: 25,
_maxListeners: Infinity,
clientInfo: [Object],
s: [Object] },
options:
{ readPreference: [Object],
promiseLibrary: [Function: Promise] },
logger: Logger { className: 'Db' },
bson: BSON {},
readPreference: ReadPreference { mode: 'primary', tags: undefined, options: undefined },
bufferMaxEntries: -1,
parentDb: null,
pkFactory: undefined,
nativeParser: undefined,
promiseLibrary: [Function: Promise],
noListener: false,
readConcern: undefined },
serverConfig: [Getter],
bufferMaxEntries: [Getter],
databaseName: [Getter] }
Interestingly the admin() helper still exists on Db instances, which of course is really just a "pre filled" selection to the old db() anyway.
Bottom line, use the MongoClient instance from the connection instead for all future code.

db.collection is not a function? What?

I am learning mongodb and following a tutorial with the below code:
My index.js file:
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://u****:p****#ds131687.mlab.com:31687/learning_mongo';
var findDocuments = function(db, callback) {
var collection = db.collection('tours');
collection.find().toArray(function(err,docs){
if (err) throw err;
console.log(docs);
callback;
})
}
MongoClient.connect(url, function(err, db){
if (err) throw err;
// console.log("it is working");
// db.close();
findDocuments(db, function(){
db.close();
});
})
Unfortunately, I get the following error in terminal:
dosstx:~/workspace $ node index.js
/home/ubuntu/workspace/node_modules/mongodb/lib/mongo_client.js:810
throw err;
^
TypeError: db.collection is not a function
at findDocuments (/home/ubuntu/workspace/index.js:6:25)
at /home/ubuntu/workspace/index.js:20:5
at args.push (/home/ubuntu/workspace/node_modules/mongodb/lib/utils.js:404:72)
at /home/ubuntu/workspace/node_modules/mongodb/lib/mongo_client.js:255:5
at connectCallback (/home/ubuntu/workspace/node_modules/mongodb/lib/mongo_client.js:933:5)
at /home/ubuntu/workspace/node_modules/mongodb/lib/mongo_client.js:807:13
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
Does anyone have any advice on how to proceed and/or what is causing the error? The tutorial author does not get this error and I can't see what else is different for me (other than possible different versions of MongoDB vs the author's?)
console.log(db) shows:
MongoClient {
domain: null,
_events: {},
_eventsCount: 0,
_maxListeners: undefined,
s:
{ url: 'mongodb://****:****#ds131687.mlab.com:31687/learning_mongo',
options:
{ user: *****,
password: ****,
socketOptions: {},
read_preference_tags: null,
readPreference: [Object],
dbName: 'learning_mongo',
servers: [Object],
auth: [Object],
server_options: [Object],
db_options: [Object],
rs_options: [Object],
mongos_options: [Object],
socketTimeoutMS: 360000,
connectTimeoutMS: 30000,
promiseLibrary: [Function: Promise] },
promiseLibrary: [Function: Promise],
dbCache: {},
sessions: [] },
topology:
Server {
domain: null,
_events:
{ serverOpening: [Function],
serverDescriptionChanged: [Function],
serverHeartbeatStarted: [Function],
serverHeartbeatSucceeded: [Function],
serverHeartbeatFailed: [Function],
serverClosed: [Function],
topologyOpening: [Function],
topologyClosed: [Function],
topologyDescriptionChanged: [Function],
joined: [Function],
left: [Function],
ping: [Function],
ha: [Function],
authenticated: [Function],
error: [Function],
timeout: [Function],
close: [Function],
parseError: [Function],
open: [Object],
fullsetup: [Object],
all: [Object],
reconnect: [Function] },
_eventsCount: 22,
_maxListeners: undefined,
clientInfo:
{ driver: [Object],
os: [Object],
platform: 'Node.js v6.11.2, LE' },
s:
{ coreTopology: [Object],
sCapabilities: null,
clonedOptions: [Object],
reconnect: true,
emitError: true,
poolSize: 5,
storeOptions: [Object],
store: [Object],
host: 'ds131687.mlab.com',
port: 31687,
options: [Object],
sessionPool: [Object],
promiseLibrary: [Function: Promise] } } }
The connect function has changed on new version of mongodb. This should work
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://u****:p****#ds131687.mlab.com:31687/learning_mongo';
var findDocuments = function(db, callback) {
var collection = db.collection('tours');
collection.find().toArray(function(err,docs){
if (err) throw err;
console.log(docs);
callback;
})
}
MongoClient.connect(url, function(err, client){
if (err) throw err;
// console.log("it is working");
// db.close();
findDocuments(client.db('learning_mongo'), function(){
db.close();
});
})
More documentation on this http://mongodb.github.io/node-mongodb-native/3.0/api/
I followed this question and was able to solve the error. Basically, I had to add the following modification to my index.js file:
MongoClient.connect('mongodb://localhost', function (err, client) {
if (err) throw err;
var db = client.db('mytestingdb');
db.collection('customers').findOne({}, function (findErr, result) {
if (findErr) throw findErr;
console.log(result.name);
client.close();
});
});
db.collection() is not a function in the latest version of MongoDB. First uninstall the latest version of MongoDB and then install version number 2.2.33 of MongoDB.
npm uninstall mongodb
npm install mongodb#2.2.33
Version MongoDB >= 3 - That database variable is actually the parent object of the object you are trying to access.

OrientDB Server Error

I have a Problem with the orientjs Driver (https://github.com/orientechnologies/orientjs) or my OrientDB (v2.1.15). I have a Node.js Server and open a Connection to the Database Server like this:
var OrientDB = require('orientjs');
var orientserver = OrientDB({
host: 'localhost',
port: 2424,
username: 'root',
password: 'Orientdb'
});
Next I open a Database Connection and work with this DB, all works fine to this point. But if I want to list all Databases with the orientserver.list() Method I get this Error:
Unhandled rejection OrientDB.RequestError: Server user not authenticated.
at Operation.parseError (/home/mklaus/IdeaProjects/Thesis/node_modules/orientjs/lib/transport/binary/protocol28/operation.js:855:13)
at Operation.consume (/home/mklaus/IdeaProjects/Thesis/node_modules/orientjs/lib/transport/binary/protocol28/operation.js:446:35)
at Connection.process (/home/mklaus/IdeaProjects/Thesis/node_modules/orientjs/lib/transport/binary/connection.js:383:17)
at Connection.handleSocketData (/home/mklaus/IdeaProjects/Thesis/node_modules/orientjs/lib/transport/binary/connection.js:284:17)
at emitOne (events.js:90:13)
at Socket.emit (events.js:182:7)
at readableAddChunk (_stream_readable.js:147:16)
at Socket.Readable.push (_stream_readable.js:111:10)
at TCP.onread (net.js:525:20)
To find the Issue I logged my Server at this Moment and get:
Server {
useToken: false,
logger:
{ error: [Function: bound bound ],
log: [Function: bound bound ],
debug: [Function] },
transport:
BinaryTransport {
domain: null,
_events: { reset: [Function: bound ] },
_eventsCount: 1,
_maxListeners: Infinity,
connecting:
Promise {
_bitField: 268566529,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_progressHandler0: undefined,
_promise0: undefined,
_receiver0: undefined,
_settledValue: [Circular],
_boundTo: [Circular] },
closing: false,
retries: 0,
maxRetries: 5,
host: 'localhost',
port: 2424,
username: 'admin',
password: 'admin',
servers: [ [Object] ],
currentServer: 0,
enableRIDBags: true,
useToken: false,
token: <Buffer >,
sessionId: 62,
logger:
{ error: [Function: bound bound ],
log: [Function: bound bound ],
debug: [Function] },
connection:
Connection {
domain: null,
_events: [Object],
_eventsCount: 3,
_maxListeners: Infinity,
host: 'localhost',
port: 2424,
socket: [Object],
logger: [Object],
enableRIDBags: true,
closing: false,
reconnectNow: false,
protocol: [Object],
queue: [],
writes: [],
remaining: null,
connecting: false,
protocolVersion: 32 },
skipServerConnect: true },
config:
{ get: [Function: bound ],
set: [Function: bound ],
list: [Function: bound ] },
domain: null,
_events:
{ reset:
[ [Function: bound ],
[Function: bound ],
[Function: bound ],
[Function: bound ],
[Function: bound ] ],
error: [ [Object], [Object] ] },
_eventsCount: 2,
_maxListeners: Infinity }
As you can see the username and the Password is wrong. Someone know why this happen? Why I cant have Access to the Server after working with one DB on it?
*edit
Here is the Code of my nodejs Server (Not everything, just the important parts)
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var stringify = require('json-stringify-safe');
var routes = require('./routes/index');
var users = require('./routes/users');
var passport = require('passport');
var expressSession = require('express-session');
var Strategy = require('passport-local').Strategy;
var users = {};
var databases = {};
var OrientDB = require('orientjs');
var orientserver = OrientDB({
host: 'localhost',
port: 2424,
httpPort: 2480,
username: 'root',
password: 'Orientdb'
});
passport.use(new Strategy({
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true
},
function(req, username, password, cb) {
var sessID = req.sessionID;
var dbkey = username+"_"+req.params.database;
if(dbkey in databases) {
} else {
databases[dbkey] = orientserver.use({
name: req.params.database,
username: username,
password: password
});
}
users[sessID]= {id: sessID, username: username, database: dbkey};
return cb(null, users[sessID]);
}));
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(expressSession({secret: 'mySecretKey', cookie: { maxAge: 60000 }}));
app.use(passport.initialize());
app.use(passport.session());
app.get('/', function (req, res) {
});
app.get('/getAllProjects', function(req, res) {
//https://github.com/kriskowal/q
orientserver.list()
.then(function (dbs) {
var json = [];
dbs.forEach(function(value, index) {
json.push({"name": value.name});
});
//console.log('There are ' + dbs.length + ' databases on the server.');
res.status(200).send(json);
});
});
app.post('/:database',
passport.authenticate('local', { failureRedirect: '/' }),
function(req, res) {
res.redirect("/"+req.params.database);
});
So when I send the second Request to getAllProjects I get the Error.

Iron router routes from db

I try to load my routes from db. My collection schema for routes is:
AsideMenu.attachSchema(
new SimpleSchema({
name: {
type: String,
denyUpdate: true
},
path: {
type: String,
denyUpdate: true
},
controller: {
type: String,
denyUpdate: true
}
})
);
I defined also a method for publish and subscribe and everything works well, i can get on client all the records on which he has access, but i cant get the router to register them.
_.map(menuRoutes, function (route) {
Router.route(route.path,
{
name: route.name,
controller: route.controller,
})
})
When I access in client console:
console.log(Router.routes) I get []
And if i print it in server console i get all routes:
I20150227-19:02:47.753(2)? { [Function]
I20150227-19:02:47.753(2)? getName: [Function],
I20150227-19:02:47.753(2)? findControllerConstructor: [Function],
I20150227-19:02:47.754(2)? createController: [Function],
I20150227-19:02:47.754(2)? setControllerParams: [Function],
I20150227-19:02:47.754(2)? dispatch: [Function],
I20150227-19:02:47.754(2)? path: [Function],
I20150227-19:02:47.754(2)? url: [Function],
I20150227-19:02:47.755(2)? params: [Function],
I20150227-19:02:47.755(2)? get: [Function],
I20150227-19:02:47.755(2)? post: [Function],
I20150227-19:02:47.755(2)? put: [Function],
I20150227-19:02:47.755(2)? delete: [Function],
I20150227-19:02:47.756(2)? options:
I20150227-19:02:47.756(2)? { name: 'calendar.index',
I20150227-19:02:47.756(2)? controller: 'CalendarController',
I20150227-19:02:47.756(2)? data: [Function],
I20150227-19:02:47.756(2)? mount: false },
I20150227-19:02:47.757(2)? _actionStack: { _stack: [], length: 0 },
I20150227-19:02:47.757(2)? _beforeStack: { _stack: [], length: 0 },
I20150227-19:02:47.757(2)? _afterStack: { _stack: [], length: 0 },
I20150227-19:02:47.757(2)? _methods: {},
I20150227-19:02:47.758(2)? _path: '/calendar',
I20150227-19:02:47.758(2)? handler:
I20150227-19:02:47.758(2)? { options: [Object],
I20150227-19:02:47.758(2)? mount: false,
I20150227-19:02:47.758(2)? method: false,
I20150227-19:02:47.759(2)? where: 'client',
I20150227-19:02:47.759(2)? name: 'calendar.index',
I20150227-19:02:47.759(2)? path: '/calendar',
I20150227-19:02:47.759(2)? compiledUrl: [Object],
I20150227-19:02:47.759(2)? handle: [Circular],
I20150227-19:02:47.917(2)? route: [Circular] },
I want to know if this is possible because i couldnt find any example with this aproach.
Yes, this should be possible. I have a similar setup working just fine, the only difference being that I create the routes from a static array, not a db query. But that should make a difference.
This works for me, when executed during load:
_.each(routes, function(foo, route) {
Router.map(function () {
this.route(route, {
path: route,
action: function() { ... }
});
});
});
Where/when are you executing the _.map code you showed?
Iron router runs a reactive computation, but at the time your subscription to your route definitions collection is not ready. So if you put that block in your ready callback which is:
Meteor.subscribe('router-data-publication', function() {
/* construct your routes here*/
});
or, you can do something safer, but essentially the same, using a handle within a Tracker and checking .ready() on the handler.