Tag: 中间件

node.js服务器端的侦听器太多了?

现在我有听众代码如下。 但是,我的服务器不断告诉我 (node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. Trace at EventEmitter.addListener (events.js:160:15) at Hub.<anonymous> (/home/ec2-user/AjaxIM-retail/server/middleware/im/hub.js:88:33) at /home/ec2-user/AjaxIM-retail/server/libs/utils.js:43:23 at IncomingMessage.<anonymous> (/home/ec2-user/AjaxIM-retail/server/libs/authentication/lp/index.js:75:33) at IncomingMessage.EventEmitter.emit (events.js:117:20) at _stream_readable.js:920:16 at process._tickCallback (node.js:415:13) (node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit. 我读了一些post,有人build议我“不要添加太多的听众”…这是正确的吗? 我该怎么办? this.events.addListener('update', […]

req.originalUrl没有设置restify(连接会话中间件需要)

当我尝试使用连接会话中间件使用restify时,出现错误。 会话中间件期望req.originalUrl但restify不设置该属性。 (它只设置req.url)这会导致会话代码中的exception。 有没有解决方法? 谢谢Sharath

如何在Connect中间件里面对mongoDB进行asynchronous调用?

比方说,我有以下的Express / Connect中间件: return function(req, res, next) { mongoose.connect(url, options); var Config = mongoose.model('Config', mongoose.Schema({ field1: Boolean, field2: [] })); Config.findOne({}, function (err, doc) { if(!err) { if(someCondition) // some logic: send response and interrupt middleware chain res.end('Some response'); else next(); } } }; 问题是数据库调用是asynchronous的。 所以中间件函数在执行任何逻辑之前退出。 任务很简单:从mongoDB读取configuration,如果某个字段值=“某些”发送响应,否则 – 继续中间件链。 所以,我现在有两个问题 : 有没有办法在中间件内部进行asynchronous调用? 如果没有,是否有任何解决方法? (AFAIK,没有办法同步执行数据库调用)

使用Express中间件进行每个请求的模块configuration?

假设对我的应用程序的每个请求都包含一个MAGIC头,并且我想在某处注入该头的值,而不更新所有的请求方法。 听起来这是中间件的工作,对吧? 但是这将是线程安全的吗? 在有多个请求可能同时在运行的环境中,有没有办法使用Express中间件来执行此操作? 换句话说,我在询问示例代码中的Express中间件是设置全局共享variables还是每个请求都由独立线程处理,其中myconfig是每个请求的独立副本。 示例代码: var assert = require('assert'); var sleep = require('sleep'); var express = require('express'); var app = express(); var myconfig = {}; app.use(function(req, res, next) { myconfig.MAGIC = req.headers['MAGIC']; next(); }); app.get('/test', function(req, res) { // Pause to make it easy to have overlap. sleep(2); // If another request comes in […]

ExpressJS>路由器中间件>通过redirect传递variablesreq.foo不工作

比方说,我有这个: a)每条路由具有1个中间件函数和一个callback函数: router.post('/foo', fooCtrl, function(req, res) { res.redirect('/bar'); }); router.get('/bar', barCtrl, function(req, res) { res.end('finished'); }); b)2个中间件函数expression式 fooCtrl = function(req, res, next) { req.foo = 'foo'; next(); }; barCtrl = function(req, res, next) { console.log(req.foo); // output is 'undefined' next(); }; 正如你所看到的,在fooCtrl中我设置了一个variablesreq.foo – 在这个范围内它被设置为…但是我不能在barCtrl范围内调用这个variables。 是不是通过引用传递的req对象? 任何build议或最佳做法? 这样做的目的是从login控制器login后,将令牌传递给pipe理员控制器..类似的东西。

Express中间件没有被调用

我正在使用快速路由器在我的应用程序中build立路由,我正在尝试将自定义中间件应用到每个路由,因此只有在为特定路由器命中URL时才会调用中间件。 这是我的代码: const express = require('express'); const router = express.Router(); const authentication = require('./helpers/authentication'); const registerController = (app, path, router, middleware) => { middleware.forEach((routerMiddleware) => { router.use(routerMiddleware); }); app.use(path, router); }; const testMiddleware = (request, response, next) => { console.log(request.originalUrl); next(); }; module.exports = { init: (app) => { registerController(app, '/auth', require('./authenticationController'), [testMiddleware]); registerController(app, '/customer', […]

为什么下面的处理程序被识别为404处理程序

我正在通过快递生成器生成的app.js ,并有以下代码: app.use('/', index); app.use('/users', users); // catch 404 and forward to error handler app.use(function (req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); 我的问题是为什么最后一个中间件函数被识别为一个函数,执行的时候not found应该返回的错误? 它是基于这样的假设:如果调用这个函数,就意味着没有其他中间件/路由器函数用res.send()完成处理请求,因此对请求不感兴趣,所以可能没有处理请求的处理程序? 如果是这样的话,应该总是最后添加404处理函数,是正确的吗?

ExpressJS 4中间件问题

我试图用ExpressJS 4把我的头围绕在中间件上。 如果我正确理解的是,中间件是按照声明的顺序来应用的,你可以在不同的层次上“绑定”它们。 在这里,我试图在路由器级绑定一个中间件。 function middleware(req, res, next) { console.log("middleware"); res.write("middleware"); next(); } function handler(req, res) { console.log("OK"); res.status(200).send('OK'); } const router1 = express.Router(); const router2 = express.Router(); router1.get("/1", handler); router2.get("/2", handler); 除了在/test/1和/test/2上调用/test/1时打印OK 。 app.use("/test/", router2.use(middleware), router1); 但是输出似乎是倒置的,相当于: app.use("/test/", router2, middleware, router1); 我真正想要的只是第一台使用中间件的路由器。 换句话说,将中间件用于第一个控制器。 我可以很容易地交换router1和router2的顺序,但是我的其他要求是因为我的router2实际上使用了一个能够捕获所有请求( /:id )的路由,我需要最后一个。 我在这里错过了什么,我该怎么做我想要的? 编辑澄清: 我最终想要的是这样的东西: / |-test/ |-route // use […]

node.js中间件和js封装

我是新来的JavaScript,并跳入node.js。 我已经阅读了很多理论,并且从实际的angular度出发(我正在为移动应用程序编写一个API),但是我有一个基本问题,这导致我转向了中间件。 我已经成功实现了一个中间件function,但是我想知道是否使用了中间件这个概念,并且还解决了把中间件带给我的原始问题。 我的问题是双重的,如下所示: 1)从我能收集到的信息来看,使用中间件的想法是在实际处理请求之前重复一个过程。 我用它来进行标记validation,如下所示:只有我的一个url没有收到一个标记参数,所以 app.js app.get('/settings', auth.validateToken, auth.settings); auth.js function validateToken(req, res, next){ //code }; 在validateToken中,我的代码检查标记,然后在一切正常的情况下调用next(),或者将res修改为json以返回特定的错误代码。 我的问题是:a)这是中间件的正确使用吗? b)是否有将值传递给下一个函数的正确方法? 而不是只有在一切正常的情况下才调用下一个函数,那么接下来哪种调用方法是正确的,并且从下一个函数(无论哪个函数)中知道中间件是否成功? 如果有的话,这将是一个适当的使用中间件? 这个精确的点使我想起了我原来的问题,这个问题的第二部分是封装函数: 这部分是固定的,看到我的第二个评论 。 2)我发现中间件试图简单地封装validateToken,并且能够从get处理程序指向的函数内部调用它,例如auth.settings。 我习惯于通用的顺序编程,而不是在JavaScript中,并没有为我的生活能够理解如何做到这一点,考虑到node.js基于事件的性质。 我现在要做的是编写一个简单的validation用户和密码的函数。 我把它完全写在一个特定的处理程序中,但正要复制粘贴到另一个,所以我停了下来。 我想从头开始做正确的事情,并理解node.js. 我一直遇到的一个具体问题是,当用户和密码不匹配时,必须返回的错误代码根据父函数而不同,所以我需要这个函数来告诉callback函数“嘿,密码和用户不匹配”,所以从父母function我可以回应正确的消息。 我想我真正想要的是写一个asynchronous函数,我可以从另一个内部调用。 我希望我已经清楚了,我一直在试图自己解决这个问题,但是我不能完全的理解我的实际问题,我猜这是因为我最近对节点的介绍。 JS 和 JS。 提前致谢! 珍妮弗。

是否有可能作为rails应用程序的一部分集成nodejs应用程序?

将NodeJS应用程序集成到现有的Rails应用程序中的最佳方式是什么? Rails应用程序: http : //www.rails.app Nodejs应用程序: http ://node.rails.app或甚至http://www.rails.app/node 23-09-2010:寻找一段时间后,我认为一个办法是有两个单独的服务: Rack(Rails)服务,将托piperails应用程序。 实时组件的NodeJS服务。 所以,我想我的问题是针对什么是服务器pipe理:我怎样才能正确地configuration一个服务器通过任何请求主机的主要应用程序http://www.rails.app/ *,但专用http://节点。 rails.app或http://www.rails.app/node到nodejs组件?