使用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) }
- 护照facebook战略投掷数据必须是使用Node.js的string
- 使用Passport无法使用Facebook进行身份validation
- 在PhoneGap应用上执行授权(通过脸书)REST请求到我的node.js服务器
- sails-auth模块给出“不能读取属性'loadStrategies'的未定义的”
- REST | 智威汤逊| 身份validation:如何validation安全资源的权限
- hapi-auth-cookie不设置cookie
- Express res.render不能使用Angular路由
- 用户注销:将GETredirect到POST(Node / Express)
- MEAN堆栈如何处理login和redirect