了解如何使用NodeJS创build一个简单的后端

我一直在尝试在nodejs中开发一个相当简单的服务器。 基本上,我要做的是一个简单的API,需要authentication(简单的用户名/密码风格)。 我不需要的是任何types的前端function(模板等)。 我的问题是,我似乎无法绕过express / node的方法。

具体来说,我的问题是:

  • 我如何连接身份validation? 我是否将多个处理程序传递给需要身份validation的每个path,还是有更好的方法来执行此操作?
  • Express中间件(如app.use(express.bodyParser()) )如何工作? 他们是否改变requestresponse对象的内容? 具体来说,如果我使用身体分析器(内部强大?),我应该在哪里访问请求数据,这应该parsing?
  • 当使用身份validation,并且我拥有存储在数据库中的凭证以及关于与个人客户相关的更多信息时,我可以在什么时候提取这些信息? 也就是说,当用户login时,我是否在login时获取用户logging并将其传递,还是在每个需要这些信息的处理程序中获取?
  • 最后,你知道我可以看看一个开源的应用程序吗? 我希望看到一些简单的身份validation,甚至可能使用强大的,因为上传文件是我的要求之一。

正如我前面提到的,我相信我的问题最终是节点中function导向方法的一个难题(另外,我在web服务编程方面的经验相当有限)。 如果你知道一个资源,我可以阅读如何构buildnodejs应用程序的方法,请不要犹豫,指向我。

我如何连接身份validation? 我是否将多个处理程序传递给需要身份validation的每个path,还是有更好的方法来执行此操作?

你应该使用会话中间件。 这里是一些伪代码:

 var http = require('http'); var app = express(); var authorize = function(req, res, next) { if(req.session && req.session.appname && req.session.appname === true) { // redirect to login page return; } next(); } app.use(express.session()); app.all('/admin*', authorize, function(req, res, next) { }); 

Express中间件(如app.use(express.bodyParser()))如何工作? 他们是否改变请求或响应对象的内容? 具体来说,如果我使用身体分析器(内部强大?),我应该在哪里访问请求数据,这应该parsing?

每个中间件都可以访问请求和响应对象。 所以,是的,它修改了它。 通常附加属性。 这意味着你的处理程序(也是一个中间件)你可以写:

 if(req.body && req.body.formsubmitted && req.body.formsubmitted === 'yes') { var data = { title: req.body.title, text: req.body.text, type: req.body.type } // store the data } 

当使用身份validation,并且我拥有存储在数据库中的凭证以及关于与个人客户相关的更多信息时,我可以在什么时候提取这些信息? 也就是说,当用户login时,我是否在login时获取用户logging并将其传递,还是在每个需要这些信息的处理程序中获取?

我认为你应该像使用其他服务器端语言一样来执行这些操作。 在会话中保持用户的状态(logging/不logging)。 您也可以保留用户的ID并为他提取数据。 这取决于你的情况,但你有能力caching信息。 因为节点不是像PHP那样,我的意思是它没有死亡。

最后,你知道我可以看看一个开源的应用程序吗? 我希望看到一些简单的身份validation,甚至可能使用强大的,因为上传文件是我的要求之一。

是的。 我用pipe理面板写了一篇关于真正简单的MVC网站的文章。 它在这里可用。 它的代码在这里 。

一个简单的方法来实现身份validation(如果你不想使用额外的模块):

 var checkAuth = function(req, res, next) { if(!req.session.user) { // Redirect to login form res.redirect("/login"); } else { // Proceed to member's area next(); } }; app.get("/member/page", checkAuth, function(req, res) { // render view, etc }); 

bodyParser将POST请求的正文parsing/转换为对象,这有助于获取表单提交值。

处理您的login表单提交的路线可以像这样访问用户名/密码:

 var username = req.body.username; var password = req.body.password; 

此时,您将查询数据库以从用户名和密码匹配的用户中进行select(您希望在生产环境中使用密码encryption)。

如果您在查询结果中返回logging,请将其设置在会话中。 一个简单的方法是:

 req.session.user = userRecord 

(调整您的会话中间件)

如果您正在寻找REST,我build议使用Restify或助推器

对于validation (与授权不同),使用标准的Basic,可以通过express.basicAuth()来处理,parsing它并将其放在req对象上。 就个人而言,我不喜欢basicAuth因为如果没有login,它将返回一个401 ,而validation的过程不同于确定是否需要validation。

对于更高级的身份validation以及会话pipe理,请使用cansecurity或护照 。 对于授权,您可以将每个路由中的单个中间件,使用cansecurity的中间件或使用其声明授权。

披露:我是助推器和cansecurity的作者。

如果你的目标是在Node.js中构build一个RESTful API,我最好的select就是使用类似Express的路线,但是消除所有高层次的东西(模板等)和广告后端function(即:身体分析器,IP黑名单,每小时的请求)。

对于authentication部分,我可能会使用另一个库,并将其连接到特定的路由。 还有ORM也可以解决你的数据库需求(mongo和mysql被很好的支持,无论是“noSQL”粉丝还是经典的db aproach)。