使用nodejs web服务器validation用户,但没有框架

仍然试图学习javascript和nodejs。 我得到了一个点,我有一个节点的服务器,它路由我的请求,回答我,查询MySQL数据库,我认为工程相当好!问题是,即时通讯需要一些方法来validation用户将是只有一个能够在数据库中编辑,删除或创buildlogging。

这将是这样的:用户1 – 浏览页面,所有select查询,除了一些将增加访问计数器用户2 – pipe理员,所有强大

我已经调查,发现了几个这样做的方式,我不明白他们很好,但他们似乎都要求我重写几乎所有的服务器! 我使用了我认为是纯粹的nodejs,

var http = require("http"); var url = require("url"); 

我也使用sequelize连接到我的分贝。

调查我发现这个: – http://passportjs.org/护照的问题是,它与快递,我将不得不重写所有

  • expressjs再次重写

  • http://mcavage.me/node-restify/我也发现restify,看起来很棒,但是这意味着完全重写已经有效的东西。

  • nodejs我似乎无法find有关身份validation的nodejs文档。

我从来没有做过身份validation,我不明白他们是如何工作,而不涉及数据库,我认为身份validation是:用户login,他的请求连接到数据库使用数据库用户具有一定的访问权限,我知道如何做数据库方面,但客户端和服务器之间发生的事情,直到它到达数据库是超越我。

我会张贴所有的来源,随意跳过他们,希望他们会帮助别人看同样的事情。

基本上,我认为唯一剩下的事情就是某种身份validation和从浏览器上传图片到服务器的能力,并将其保存在服务器中。 我将实现一个angularjs客户端(我仍然还没有学习),将会提出所有请求。

任何帮助将非常感激!

index.js

 var server = require("./server"); var router = require("./router"); var requestHandlers = require("./requestHandlers"); var handle = {}; handle["/insertHood"] = requestHandlers.insertHood; handle["/selectHood"] = requestHandlers.selectHood; server.start(router.route, handle); 

server.js

 var http = require("http"); var url = require("url"); //This module has utilities for URL resolution and parsing. http://nodejs.org/api/all.html#all_url function start(route, handle) { //the web service will respond with this function onRequest(request, response) { var urlValues = { params: {}, pathName: "" }; var postData = ""; //read the url used to call our web service parseUrl(request, urlValues); //console.log("path: " + urlValues.pathName); //console.log("params: " + JSON.stringify(urlValues.params)); //set encoding for the recieved request request.setEncoding("utf8"); //if post data is recieved process it here by chunks request.addListener("data", function (postDataChunk) { postData += postDataChunk; console.log("Recieved POST data chunk '" + postDataChunk + "'."); } ); //when we are done storing all the post data, go to the pathName request.addListener("end", function () { route(handle, urlValues, response, postData); } ); } http.createServer(onRequest).listen(8888); console.log("Server has started"); } function parseUrl(request, urlValues) { urlValues.pathName = url.parse(request.url).pathname; //parse the url pathName urlValues.params = url.parse(request.url, true).query; } exports.start = start; exports.parseUrl = parseUrl; 

router.js

 function route(handle, urlValues, response, postData) { console.log("Router.js --> About to route a request for " + urlValues.pathName); if (typeof handle[urlValues.pathName] === 'function') { handle[urlValues.pathName](response, urlValues, postData); } else { response.writeHead(404, { "Content-Type": "text/plain" }); response.write("404, no request handler found for " + urlValues.pathName); response.end(); } } exports.route = route; 

requesthandlers.js

 var exec = require("child_process").exec; var db = require("./dataBase"); function insertHood(response, urlValues) { urlValues.params["zoom_level"] = parseInt(urlValues.params["zoom_level"]); urlValues.params["lat"] = parseFloat(urlValues.params["lat"], 10); urlValues.params["lon"] = parseFloat(urlValues.params["lon"], 10); console.log("requestHandler.js --> Request handler 'insertHood' was called."); var result = db.execute("modify", 'INSERT INTO neighborhood (hood_location, hood_name, zoom_level) values (GeomFromText(\'POINT(:lat :lon)\'), :name, :zoom_level)', response, urlValues.params); } function selectHood(response, urlValues) { console.log("requestHandler.js --> Request handler 'selectHood' was called."); var result = db.execute("select", 'select x(hood_location), y(hood_location), hood_name, zoom_level from neighborhood where hood_name = :name', response, urlValues.params); } exports.insertHood = insertHood; exports.selectHood = selectHood; 

database.js

 var Sequelize = require("sequelize"); //this tells sequelize how to connect to the data base //see http://sequelizejs.com/documentation#usage-basics var sequelize = new Sequelize('mydb', 'myuser', 'mypass', { host: "localhost", port: 3306, dialect: 'mysql' } ); /* Pre: type: a string to know if the query is a select and returns rows, or a modify query, and returns nothing query: an sql query in string format with the parameters :param in place response: a response object where the results of the query will be written parameters: from sequelize, an array with the parameter for the sql query in the correct order Pos: response: the object will have the results of the query, an error or the rows of the results set */ function execute(type, query, response, parameters) { console.log("Query: " + query); var options = { raw: true }; var result = sequelize.query(query, null, options, parameters) .success(function (rows) { if (type == 'select') { response.writeHead(200, { "Content-Type": "application/json" }); response.write(JSON.stringify(rows)); response.end(); } else if (type == 'modify') { response.writeHead(200, { "Content-Type": "text/html" }); response.write("Query was successful"); response.end(); } } ).error(function (e) { console.log("An error occured: ", e); response.writeHead(404, { "Content-Type": "text/html" }); response.write("There was an error man, shits on fire yo ---> " + e); response.end(); } ); } exports.execute = execute; 

即使没有外部框架,基本authentication也不是太困难。 最困难的部分实际上只是妥善维护会议。 我强烈build议你使用session ,但这不是必须的。 Connect的会话在这里是非常理想的,因为它pipe理过期的会话,所以你没有一个不断增加的对象。

为了维护身份validation,一旦用户input了他们的凭证并将其发送到服务器,请使用有效的凭据进行交叉检查; 如果它们匹配,则需要在客户端存储一个具有唯一UUID的cookie。 在服务器端,保持包含所有经过身份validation的用户的散列的对象。 这样,一旦用户连接,服务器可以检查他们是否已经有一个cookie来certificate他们的凭据,所以你不必login每一个页面。

像这样的东西应该在基本情况下工作:

路由:

var sessions = {}

 if(req.headers.cookies['sid'] && sessions[req.headers.cookies['sid']]) //continue else //return login page 

在用户login时:

 if(req.query.username == someUsername && req.query.password == somePassword){ res.writeHead(200, { 'Set-Cookie': 'sid=UUID', //will need a uuidgen here 'Content-Type': 'text/plain' }) sessions[UUID] = true //store session on server return res.send(200,somePage) }