Updated Todo Node.Js app to use express4-tedious middleware

Node.js data access added as npm module express4-tedious.
This commit is contained in:
Jovan Popovic
2017-05-08 13:05:09 +02:00
parent 7104348294
commit e486860a32
6 changed files with 42 additions and 115 deletions
@@ -2,4 +2,6 @@ node_modules/*
bin/*.dll
obj/*
*.sln
*.log
*.log
config/Development.json
config/Production.json
@@ -1,13 +1,20 @@
var express = require('express');
var config = require('config');
var bodyParser = require('body-parser');
var tediousExpress = require('express4-tedious');
var app = express();
app.use(function (req, res, next) {
req.query = tediousExpress(req, config.get('connection'));
next();
});
app.use(bodyParser.text());
app.use('/todo', require('./routes/todo'));
// catch 404 and forward to error handler
app.use(function (req, res, next) {
var err = new Error('Not Found');
var err = new Error('Not Found: '+ req.method + ":" + req.originalUrl);
err.status = 404;
next(err);
});
@@ -0,0 +1,8 @@
{
"connection":{
"server" : "<<server name or ip>>",
"userName": "<<user name>>",
"password": "<<password>>",
"options": { "encrypt": true, "database": "<<database name>>" }
}
}
@@ -1,85 +0,0 @@
function createConnection() {
var config = {
server : "SERVER.database.windows.net",
userName: "USER",
password: "PASSWORD",
// If you're on Azure, you will need this:
options: { encrypt: true, database: 'DATABASE' }
};
var Connection = require('tedious').Connection;
var connection = new Connection(config);
return connection;
}
function createRequest(query, connection) {
var Request = require('tedious').Request;
var req =
new Request(query,
function (err, rowCount) {
if (err) {
console.trace(err);
throw err;
}
connection && connection.close();
console.log('Connection closed');
});
return req;
}
function stream (query, connection, output, defaultContent) {
var request = query;
if (typeof query == "string") {
request = createRequest(query, connection);
}
var empty = true;
request.on('row', function (columns) {
if(empty) {
console.log('Response fetched from SQL Database!');
empty = false;
}
output.write(columns[0].value);
});
request.on('done', function (rowCount, more, rows) {
_OnDone(empty, defaultContent, output);
});
request.on('doneProc', function (rowCount, more, rows) {
_OnDone(empty, defaultContent, output);
});
executeRequest (request, connection);
}
function _OnDone(empty, defaultContent, output) {
if(empty) {
output.write(defaultContent);
console.log('No results from database - default content is returned.');
}
try {
console.log('Closing Http Response output.');
output.end();
} catch (err) {
console.error(err);
}
}
function executeRequest (request, connection) {
connection.on('connect', function (err) {
if (err) {
console.trace(err);
throw err;
}
connection.execSql(request);
});
}
module.exports.createConnection = createConnection;
module.exports.createRequest = createRequest;
module.exports.executeRequest = executeRequest;
module.exports.stream = stream;
@@ -12,8 +12,10 @@
},
"dependencies": {
"body-parser": "^1.15.2",
"config": "^1.26.1",
"debug": "^2.2.0",
"express": "^4.14.0",
"tedious": "^1.14.0"
"tedious": "^1.14.0",
"express4-tedious": "^0.1.0"
}
}
@@ -1,56 +1,49 @@
var express = require('express');
var router = express.Router();
var db = require('../db.js');
var router = require('express').Router();
var TYPES = require('tedious').TYPES;
/* GET task listing. */
router.get('/', function (req, res) {
db.stream("select * from todo for json path", db.createConnection(), res, '[]');
req.query("select * from todo for json path")
.into(res, '[]');
});
/* GET single task. */
router.get('/:id', function (req, res) {
var conn = db.createConnection();
req.query("select * from todo where id = @id for json path, without_array_wrapper")
.param('id', req.params.id, TYPES.Int)
.into(res, '{}');
var request = db.createRequest("select * from todo where id = @id for json path, without_array_wrapper", conn);
request.addParameter('id', TYPES.Int, req.params.id);
db.stream(request, conn, res, '{}');
});
/* POST create task. */
router.post('/', function (req, res) {
var connection = db.createConnection();
var request = db.createRequest("exec createTodo @todo", connection);
request.addParameter('todo', TYPES.NVarChar, req.body);
db.executeRequest(request, connection);
req.query("exec createTodo @todo")
.param('todo', req.body, TYPES.NVarChar)
.exec(res);
});
/* PUT update task. */
router.put('/:id', function (req, res) {
var connection = db.createConnection();
var request = db.createRequest("exec updateTodo @id, @todo", connection);
request.addParameter('id', TYPES.Int, req.params.id);
request.addParameter('todo', TYPES.NVarChar, req.body);
db.executeRequest(request, connection);
req.query("exec updateTodo @id, @todo")
.param('id', req.params.id, TYPES.Int)
.param('todo', req.body, TYPES.NVarChar)
.exec(res);
});
/* DELETE single task. */
router.delete('/:id', function (req, res) {
var connection = db.createConnection();
var request = db.createRequest("delete from todo where id = @id", connection);
req.query("delete from todo where id = @id")
.param('id', req.params.id, TYPES.Int)
.exec(res);
request.addParameter('id', TYPES.Int, req.params.id);
db.executeRequest(request, connection);
});
module.exports = router;