Error connecting to SQL Server 2012 using NodeJS and mssql package - javascript

I'm using the mssql package for node in a MacOs Monterey:
import mssql from "mssql"
connect = async () => {
try {
var cfg = {
server: "10.0.0.180",
authentication: {
type: "default",
options: {
userName: "username",
password: "password",
},
},
options: {
encrypt: true,
enableArithAbort: true,
integratedSecurity: true,
trustServerCertificate: true,
rowCollectionOnDone: true,
database: "db",
cryptoCredentialsDetails: {
// Required for SQL Server 2012 connection,
// as node 18 uses a newer TLS protocol
minVersion: "TLSv1",
},
},
};
let conn = await mssql.connect(cfg);
return conn;
} catch (error) {
return null;
}
return false;
};
Working with node v18.13.0 I'm getting the following error:
ConnectionError: Failed to connect to 10.0.0.180:1433 - 0036761901000000:error:0A000102:SSL routines:ssl_choose_client_version:unsupported protocol:../deps/openssl/openssl/ssl/statem/statem_lib.c:1986:
My project config:
"dependencies": {
"mssql": "^9.0.1",
"nconf": "^0.12.0",
"qs": "^6.11.0"
},
"devDependencies": {
"#babel/core": "^7.20.2",
"#babel/node": "^7.20.2",
"#babel/preset-env": "^7.20.2",
"babel-loader": "^9.1.0",
"webpack": "^5.75.0",
"webpack-cli": "^4.10.0"
}
I'm stuck on that as I cannot connect to the database. What might be causing this?

Related

Model.create is not a function at seed

I am trying to seed my db and this issue is preventing that. It keeps saying "Inventory.create is not a function
at seed". I am not sure if this is a syntactical issue, a logistical problem or even a dependency issue so please point me in the wrong direction.
The tech stack that I am using is Express, Node.js, Sequelize, PostgreSQL
My files are structured as such:
--script
-seed.js
--server
-api
-db
-Model.js
-index.js
-db.js
-app.js
-index.js
Model.js
const db = require('./db');
const Model = db.define('model', {
name: {
type: Sequelize.STRING,
allowNull: false,
},
total: {
type: Sequelize.FLOAT,
allowNull: false,
},
})
module.export = Model;
index.js
const db = require('./db')
const Inventory = require('./Inventory')
module.exports = {
db,
models: {
Inventory,
},
}
db.js
const Sequelize = require('sequelize')
const pkg = require('../../package.json')
const databaseName = pkg.name + (process.env.NODE_ENV === 'test' ? '-test' : '')
if(process.env.LOGGING === 'true'){
delete config.logging
}
if(process.env.DATABASE_URL){
config.dialectOptions = {
ssl: {
rejectUnauthorized: false
}
};
}
const db = new Sequelize(
process.env.DATABASE_URL || `postgres://localhost:5432/${databaseName}`, {
logging: false,
})
module.exports = db
seed.js
'use strict'
const {db, models: {Model}} = require('../server/db')
async function seed() {
await db.sync({ force: true })
console.log('db synced!')
// Creating Inventory
const stock = await Promise.all([
Model.create({ name: 'First', amount: 200 }),
Model.create({ name: 'Second', amount: 200 }),
])
console.log(`seeded successfully`)
}
async function runSeed() {
console.log('seeding...')
try {
await seed()
} catch (err) {
console.error(err)
process.exitCode = 1
} finally {
console.log('closing db connection')
await db.close()
console.log('db connection closed')
}
}
if (module === require.main) {
runSeed()
}
module.exports = seed
I included this just in case
package.json
{
"name": "ShopifyInventory",
"version": "1.0",
"description": "Simple backend heavy app for inventory management",
"main": "app.js",
"scripts": {
"build": "webpack",
"build:dev": "npm run build -- --watch --mode=development",
"seed": "node script/seed.js",
"start": "node server"
},
"dependencies": {
"axios": "^0.21.1",
"bcrypt": "^5.0.0",
"compression": "^1.7.3",
"express": "^4.18.1",
"history": "^4.9.0",
"jsonwebtoken": "^8.5.1",
"morgan": "^1.9.1",
"pg": "^8.7.3",
"pg-hstore": "^2.3.4",
"react": "^18.1.0",
"react-dom": "^18.1.0",
"react-router-dom": "^6.3.0",
"sequelize": "^6.19.2"
},
"author": "Galilior :)",
"devDependencies": {
"#babel/core": "^7.17.12",
"#babel/preset-react": "^7.17.12",
"babel-loader": "^8.2.5",
"webpack": "^5.72.1",
"webpack-cli": "^4.9.2"
}
}

Why isn't my mongoose sort method working?

All right. So. I have a really basic API running on Node.js. I'm also using MongoDB as a database and I'm using Mongoose to build queries. My problem is that I'm trying to query for a sorted list of data using using the mongoose 'sort' method. For some reason the method isn't working and Node tries to use the Javascript sort method instead. This is my code:
Query handling:
const mongoose = require("mongoose");
const express = require("express");
const Tour = require("../models/tourModel.js");
exports.getAllTours = async (req, res) => {
try {
// eslint-disable-next-line node/no-unsupported-features/es-syntax
const queryObject = { ...req.query };
const excludedFields = ["page", "sort", "limit", "fields"];
excludedFields.forEach((el) => delete queryObject[el]);
let queryStr = JSON.stringify(queryObject);
queryStr = queryStr.replace(/\b(gte|gt|lte|lt)\b/g, (match) => `$${match}`);
let query = await Tour.find(JSON.parse(queryStr));
// query.sort((a, b) => (a[req.query.sort] > b[req.query.sort] ? 1 : -1));
if (req.query.sort) {
query = query.sort(req.query.sort);
}
const tours = await query;
res.status(200).json({
status: "success",
data: { tours },
});
} catch (error) {
res.status(400).json({ status: "failed", message: error.message });
}
};
Router
const tourController = require("../controllers/tourController");
const router = express.Router();
// router.param("id", tourController.checkID);
router
.route("/")
.get(tourController.getAllTours)
.post(tourController.createTour);
router
.route("/:id")
.get(tourController.getTourById)
.patch(tourController.updateTour)
.delete(tourController.deleteTour);
module.exports = router;
Package.json
"name": "natours",
"version": "1.0.0",
"description": "fdsfd",
"main": "index.js",
"scripts": {
"start:dev": "nodemon server.js",
"start:prod": "nodemon server.js NODE_ENV=production "
},
"author": "me",
"license": "ISC",
"dependencies": {
"dotenv": "^8.2.0",
"express": "^4.17.1",
"mongoose": "^5.12.7",
"morgan": "^1.10.0"
},
"devDependencies": {
"eslint": "^7.25.0",
"eslint-config-airbnb": "^18.2.1",
"eslint-config-prettier": "^8.3.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^3.4.0",
"eslint-plugin-react": "^7.23.2",
"prettier": "^2.2.1"
}
}
When I try to query for 127.0.0.1:3000/api/v1/tours?sort=price,
I get a response
{
"status": "failed",
"message": "The comparison function must be either a function or undefined"
}
I'm a real noob in this so does anyone have any ideas what is causing this or how to fix it?
let query = await Tour.find(JSON.parse(queryStr));
This is the result of your query since await executes the query. If you want to store the query, don't use await
let query = Tour.find(JSON.parse(queryStr));
// query.sort((a, b) => (a[req.query.sort] > b[req.query.sort] ? 1 : -1));
if (req.query.sort) {
query = query.sort(req.query.sort);
}
const tours = await query;

Webpack cannot find any of the modules imported

I have this code:
import "reflect-metadata";
// import { ApolloServer } from "apollo-server-express";
const ApolloServer = require("apollo-server-express");
const express = require("express");
const buildSchema = require("type-graphql");
const createConnection = require("typeorm");
const cors = require("cors");
import { UserResolvers } from "./graphql/user/UserResolver";
import { UserModel } from "./graphql/user/UserModel";
import { TodoItemModel } from "./graphql/todoItem/TodoItemModel";
const app = express();
app.use(cors());
(async () => {
const schema = await buildSchema({
resolvers: [UserResolvers],
});
const server = new ApolloServer({ schema });
const { host, port, username, password, database } = process.env;
console.log({ host }, { port }, { username }, { password }, { database });
app.get("/user");
server.applyMiddleware({ app });
await createConnection({
type: "mysql",
host,
port: parseInt(port),
username,
password,
database,
entities: [UserModel, TodoItemModel],
synchronize: true,
logging: true,
})
app.listen(4000, () => {
console.log(
`🚀 Server ready at http://localhost:4000${server.graphqlPath}`
);
});
})();
And here's my webpack.config
const path = require("path");
module.exports = {
entry: "./src/index.ts",
module: {
rules: [
{
test: /\.ts?$/,
use: "ts-loader",
exclude: /node_modules/,
},
],
},
resolve: {
extensions: [".ts"],
},
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "dist"),
},
mode: "development",
};
And I build it using:
webpack --config webpack.config.js
The problem is I'm getting:
ERROR in ./node_modules/apollo-server-express/dist/index.js 27:21-46
Module not found: Error: Can't resolve './ApolloServer' in '/home/aironside/Documents/private/todo-app-graphql/backend/node_modules/apollo-server-express/dist'
# ./src/index.ts 40:19-51
ERROR in ./node_modules/cors/lib/index.js 5:15-39
Module not found: Error: Can't resolve 'object-assign' in '/home/aironside/Documents/private/todo-app-graphql/backend/node_modules/cors/lib'
# ./src/index.ts 44:11-26
ERROR in ./node_modules/cors/lib/index.js 6:13-28
Module not found: Error: Can't resolve 'vary' in '/home/aironside/Documents/private/todo-app-graphql/backend/node_modules/cors/lib'
# ./src/index.ts 44:11-26
ERROR in ./node_modules/graphql-subscriptions/dist/index.js 3:22-48
Module not found: Error: Can't resolve './pubsub-engine' in '/home/aironside/Documents/private/todo-app-graphql/backend/node_modules/graphql-subscriptions/dist'
# ./node_modules/type-graphql/dist/index.js 11:30-62
# ./src/index.ts 42:18-41
... and other similar errors, as if I didn't have these modules installed (They are installed)
I tried import {} from, import x from, const x = require('x'), and const {} = require(). I keep getting the same error.
my package.json dependencies
"dependencies": {
"apollo-server-express": "^2.21.1",
"bcrypt": "^5.0.1",
"cors": "^2.8.5",
"express": "^4.17.1",
"type-graphql": "^1.1.1",
"typeorm": "^0.2.31"
},
"devDependencies": {
"#babel/core": "^7.13.10",
"#babel/preset-env": "^7.13.10",
"#types/bcrypt": "^3.0.0",
"#types/express": "^4.17.11",
"babel-loader": "^8.2.2",
"concurrently": "^6.0.0",
"nodemon": "^2.0.7",
"ts-loader": "^8.0.18",
"typescript": "^4.2.3",
"webpack": "^5.27.1",
"webpack-cli": "^4.5.0"
},
What am I missing?

How to make MSSQL connection using Node.js in vue.js frontend?

I need to connect Vue.js app to the remote MSSQL server.
I am using node.js, mssql library.
After setting up I get error.
How to make configuration settings in order to connect to mssql?
How to solve issues related to installation of libraries?
ERROR Failed to compile with 5 errors 1:39:06 PM
These dependencies were not found:
* dgram in ./node_modules/native-dns-cache/lookup.js, ./node_modules/native-dns/lib/server.js and 2 others
* fs in ./node_modules/native-dns/lib/platform.js
To install them, you can run: npm install --save dgram fs
package.json dependencies:
...
},
"dependencies": {
"dgram": "^1.0.1",
"dns": "^0.2.2",
"firebase": "^4.10.0",
"fs": "0.0.1-security",
"highcharts": "^6.0.7",
"mssql": "^4.1.0",
"net": "^1.0.2",
"tls": "0.0.1",
"vue": "^2.5.3",
"vue-highcharts": "0.0.10",
"vue-router": "^3.0.1",
"vuetify": "^0.17.7",
"vuex": "^3.0.1"
}, ...
I solve this problem. As I am very new in this environment. Vue app renders client-side. I build server-side using template "webpack-ssr".
Here is more information about server-side rendering
here is my test code:
...
const sql = require('mssql')
...
// Create connection to database
const databaseConfig = {
userName: 'USER_NAME',
password: 'PASSWORD',
server: 'SERVER_NAMECLOUDAPP.AZURE.COM',
database: 'DATABASE',
options: {
encrypt: true // Use this if you're on Windows Azure
}
}
...
Data conncetion:
// mssql connect for database
sql.connect(databaseConfig, err => {
// ... error checks
if (err) {
console.log('error: ' + err)
} else {
console.log('conencted')
}
// Query
new sql.Request().query('select 1 as number', (err , result) => {
// ... error checks
...
console.dir(result + ' hmmm ... not good')
})
})
...

mongodb connection timeout error with mongoose and nodejs

I desperately need some help.I am trying to upload large file(8 GB) to gridfs using mongoose and nodeJS. But as the file is very large it takes some time to upload. And after a while I get the following error:
home/user/FileUpload/node_modules/mongodb/lib/utils.js:98
process.nextTick(function() { throw err; });
^
MongoError: connection 0 to 127.0.0.1:27017 timed out
at Function.MongoError.create (/home/user/FileUpload/node_modules/mongodb-core/lib/error.js:29:11)
at Socket.<anonymous> (/home/user/FileUpload/node_modules/mongodb-core/lib/connection/connection.js:186:20)
at Object.onceWrapper (events.js:314:30)
at emitNone (events.js:105:13)
at Socket.emit (events.js:207:7)
at Socket._onTimeout (net.js:402:8)
at ontimeout (timers.js:488:11)
at tryOnTimeout (timers.js:323:5)
at Timer.listOnTimeout (timers.js:283:5)
I have tried to resolve this by increasing connectTimeoutMS but the error still persist. I am using MongoDB 3.4.5 mongoose 4.8.4 nodejs 8.1.4 and npm 5.0.3.
Following is app.js:
var mongoose = require('mongoose');
var schema = mongoose.schema;
mongoose.connect('mongodb://127.0.0.1/gridFS'),{
server: {
socketOptions: {
socketTimeoutMS: 3000000,
connectionTimeoutMS: 3000000,
keepAlive:3000000
}
},
replset: {
socketOptions: {
keepAlive: 3000000,
connectTimeoutMS: 3000000
}
}
};
var conn = mongoose.connection;
var path = require('path');
var Grid = require('gridfs-stream');
var fs = require('fs');
var videoPath = path.join(__dirname, 'readFrom/bio seq test1.txt');
Grid.mongo = mongoose.mongo;
conn.once('open', function(){
console.log('- connection open -');
var gfs = Grid(conn.db);
var writestream = gfs.createWriteStream({
filename: 'bio seq test 1'
});
fs.createReadStream(videoPath).pipe(writestream);
writestream.on('close', function(file){
console.log(file.filename + 'Written to DB');
});
});
Following is package.json file:
{
"name": "file-upload-gridfs",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo '' && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"body-parser": "^1.16.1",
"cookie-parser": "^1.4.3",
"express": "^4.14.1",
"gridfs-stream": "^1.1.1",
"mongoose": "^4.8.4",
"morgan": "^1.8.2",
"multer": "1.3.0",
"multer-gridfs-storage": "1.0.0",
"path.join": "^1.0.0",
"serve-favicon": "^2.4.3"
}
}
Ok. I figured out the problem using this really helpful discussion.The default socket connection time for MongoDB is 30 seconds. If any query/operation takes longer than this the connection is aborted and connection timeout error occurs.
With this change I was able to upload a 32GB file to GridFS without any interruption.
https://github.com/Automattic/mongoose/issues/4789
I was passing the timeout parameter in following way.
server: {
socketOptions: {
socketTimeoutMS: 3000000,
connectionTimeoutMS: 3000000,
keepAlive:3000000
}
},
replset: {
socketOptions: {
keepAlive: 3000000,
connectTimeoutMS: 3000000
}
}
};
But it needs to be set in the following way:
const serverOptions = {
poolSize: 100,
socketOptions: {
socketTimeoutMS: 6000000
}
};
mongoose.createConnection(dbpath, {
server: serverOptions,
replset: serverOptions //if you are using replication
});
In my case I have used localhost.
const serverOptions = {
poolsize:100 ,
socketOptions:{
socketTimeoutMS: 6000000
}
};
var mongodbUri = 'mongodb://localhost:27017/gridFS';
mongoose.connect(mongodbUri, {
server: serverOptions
});
Hope this will help anyone with similar issue.

Categories

Resources