Connect to mLab mongoDB database using nodeJS Strapi - node.js

I just got started using strapi framework and I would like to use mLab as my mongoDB database, so I go to configure strapi and fill the following details:
{
"defaultConnection": "default",
"connections": {
"default": {
"connector": "strapi-mongoose",
"settings": {
"client": "mongo",
"host": "localhost",
"port": 27017,
"database": "development",
"username": "",
"password": ""
},
"options": {}
}
}
}
The details I get from mLab are:
mongodb://myUsername:myPassword#ds047891.mlab.com:41365/myDatabase
Here is my final config:
{
"defaultConnection": "default",
"connections": {
"default": {
"connector": "strapi-mongoose",
"settings": {
"client": "mongo",
"host": "ds047891.mlab.com",
"port": 41365,
"database": "myDatabase",
"username": "myUsername",
"password": "myPassword"
},
"options": {}
}
}
}
When I try to start strapi, I get the following error:
DEBUG (2748 on DESKTOP-HAL1ATE): Server wasn't able to start properly.
ERROR (2748 on DESKTOP-HAL1ATE): (hook:mongoose) takes too long to load
I think that I did not setup my configuration right, but I can't pinpoint where the problem is. I hope someone could, thanks.

I am Pierre, on of the creators of Strapi. I tried with the following configuration and it worked well:
{
"defaultConnection": "default",
"connections": {
"default": {
"connector": "strapi-mongoose",
"settings": {
"client": "mongo",
"host": "ds135777.mlab.com",
"port": "35777",
"database": "myDatabase",
"username": "myUsername",
"password": "myPassword"
},
"options": {}
}
}
}
Our configurations files look quiet similar.
What file did you updated (/config/environment/development/database.json or /config/environment/production/database.json)?
Are you sure you entered the correct username and password? Did you try to login to your MongoDB instance through the command line mongo ds135777.mlab.com:35777/myDatabase -u <dbuser> -p <dbpassword>?
UPDATE
In version >= 3 for mlab don't forget to specify authenticationDatabase
"options": {
"authenticationDatabase": "your_mlad_database_name",
"ssl": false
}

Related

Strapi changing mongo uri has no effect

I've created a Strapi cms instance connecting to a remote Atlas db.
Now I have to create some more environments so I'm trying to change the development database uri.
but changing the uri in config/environments/development/database.json has. no effect.
I'm:
Changing the value
Running strapi build
Running strapi develop
all the old content is still there
Not everything is stored in the database, model settings are stored in files
You should change the values of the file:
Path: ./config/environments/(development|production)/database.json.
example:
{
"defaultConnection": "default",
"connections": {
"default": {
"connector": "strapi-mongoose",
"settings": {
"client": "mongo",
"host": "ds125048.mlab.com",
"port": "25048",
"database": "myapp-development",
"username": "myusername",
"password": "mypassword"
},
"options": {
"authenticationDatabase": "myapp-development",
"ssl": false
}
}
}
}
Then re-deploy to your app
more details

loopback 3 creating only test database for mongo

I exported NODE_ENV=local and defined my mongo datasource as follows in datasources.local.json
"mongo": {
"host": "localhost",
"port": 27017,
"url": "mongodb://localhost:27017/mydb",
"database": "mydb",
"password": "",
"name": "mongo",
"user": "",
"connector": "mongodb"
},
But the database name is getting created as 'test'.I also tried in datasources.json but it's still the same. I need the database name to be 'mydb'. Please help
What fixed the problem for me was to set the name of the object to "db" and not "mongo" or "mongods".
"db": {
"host": "localhost",
"port": 27017,
"url": "mongodb://localhost:27017/mydb",
"database": "mydb",
"password": "",
"name": "mongo",
"user": "",
"connector": "mongodb"
},

TypeORM with multiple env setups

I want to use a separate database for running tests. So I tried to configure TypeORM for multiple environments (dev and test) but it's not working. It only use the 'dev' configuration.
This is my npm scripts:
"scripts": {
"start": "NODE_ENV=dev node dist/index.js",
"test": "NODE_ENV=test mocha --reporter spec --compilers ts:ts-node/register 'test/**/*.test.ts'"
}
If I console.log(process.env.NODE_ENV) I get the correct results ("dev" / "test").
This is my ormconfig.json
[
{
"environment": "dev",
"name": "default",
"driver": {
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "",
"database": "api"
},
"entities": [ "dist/model/*.js" ],
"autoSchemaSync": true
},
{
"environment": "test",
"name": "default",
"driver": {
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "",
"database": "api_test"
},
"entities": [ "dist/model/*.js" ],
"autoSchemaSync": true
}
]
I connect with createConnection();. I manually created both databases api and api_test beforehand.
Why is TypeORM not using the "test" configuration when I set NODE_ENV=test?
You could change your ormconfig.json to a js file then do something similar to this:
require('dotenv/config');
const database = {
development: "dev-db",
production: 'prod-db',
test: 'test-db'
}
module.exports = {
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'ur-username',
password: 'password',
database: database[process.env.NODE_ENV],
entities: ['dist/**/*.entity{.ts,.js}'],
synchronize: true,
migrationsTableName: 'migration',
migrations: ['migration/*.js'],
cli: {
migrationsDir: 'migration',
},
};
Then when running your tests, don't forget to set the appropriate environment. NODE_ENV=test should do.
I had a similar problem. I got this to work by using different 'name' fields for each connection. For my run-time connection, I kept name=default, and for my test connection I used name=test. So:
[
{
"environment": "dev",
"name": "default",
"driver": {
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "",
"database": "api"
},
"entities": [ "dist/model/*.js" ],
"autoSchemaSync": true
},
{
"environment": "test",
"name": "test", //// CHANGED
"driver": {
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "root",
"password": "",
"database": "api_test"
},
"entities": [ "dist/model/*.js" ],
"autoSchemaSync": true
}
]
In my application, I would simply use createConnection(), which would automatically use the connection with name=default.
For my tests, I used typeorm's createConnections() (notice the s). This loads all connections. Once loaded, I would immediately after use getConnection('test'), which would get the test connection. My beforeAll in my tests looked like this in typescript:
beforeAll(async () => {
await createConnections();
getConnection('test');
});
In javascript, it would probably look something like:
beforeAll(() => {
createConnections().then(() => {
getConnection('test');
});
});
Then my tests started to pass. Hope that helps.
I had the same problem and I solved it by installing cross-env and the dotenv-flow package.
My typeorm script looked like this:
"typeorm": "cross-env NODE_ENV=development ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli -d src/core/database/ormconfig.ts",
And I created an ormconfig.ts file, where I define the database connection variables through process.env, and all I had to do was add the "require" related to "dotenv-flow".
My ormconfig.ts
import { DataSource } from "typeorm";
require('dotenv-flow').config();
export const AppDataSource = new DataSource({
type: 'postgres',
host: process.env.DB_HOST,
port: parseInt(process.env.DB_PORT) || 5432,
username: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_NAME,
entities: [
],
migrations: [
],
migrationsRun: false,
migrationsTableName: 'history'
});
This option is no longer available.
You can see the pull request that removed it from the TypeORM docs, in Aug, 2017, here:
https://github.com/typeorm/typeorm.github.io/pull/13/files
The functionality itself seems to have been removed in a commit with other changes to fix another (unrelated?) issue. It is not immediately clear what the intent was in removing it.

Loopback - "Cannot read property 'connector' of null" in Connector hooks

I tried to follow this example
https://docs.strongloop.com/display/public/LB/Connector+hooks
var connector = MyModel.getDataSource().connector;
connector.observe('before execute', function(ctx, next) {
// ...
next();
});
But the property 'connector' seems to be undefined. I need to add a connector hook in the boot script. Any idea?
Use something like this to add a connector.
In server/datasource.json
{
"db": {
"host": "",
"port": 0,
"database": "",
"password": "",
"name": "db",
"connector": "memory",
"user": ""
},
"mongodb": {
"host": "0.0.0.0",
"port": 27017,
"database": "drugcorner",
"password": "12345",
"name": "mongodb",
"connector": "mongodb",
"user": "robins"
}
}
We have have MongoDb datasource datasource defined with name mongodb.
Now to use a connector for mongodb inside any boot files.
server/boot/testConnector.js
var mongoConnector = app.dataSources.mongodb.connector;

Configure node.js chat

I am trying to install and run this node.js chat: https://github.com/dual3nigma/Mejorando.la-Chat.
When I type "npm install" and "node server" it starts, but with an Express error. I think the reason is in the config.json file.
This is my config.json file. I've only changed the db name and port of the config.sample.json file and added my twitter / facebook keys:
{
"port": 721,
"host": "localhost",
"db": {
"name": "V1chatCCI"
},
"twitter": {
"consumerKey": "XXXXXXXXXXXXXXXXXXXXXXXXXX",
"consumerSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
"facebook": {
"appId": "XXXXXXXXXXXXXXXXXXXXXXXX",
"appSecret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
"session": {
"secret": "",
"key": ""
},
"cookie": {
"secret": ""
},
"secure": false,
"loginsecure": false,
"key": "",
"cert": "",
"sentry": "dsn"
}
What do I need to put in the session secret/key section? The error on localhost:721 is:
Express
500 Error: secret option required for sessions
You should be able to put anything in those sections, as they're used used internally by express handling sessions. Any values (even just random strings) should fix your problem.

Resources