Tag: error handling

使用Q处理exception的node.js

我一直在使用节点几个月。 对于asynchronous代码中的error handling,我一直遵循我所知道的最佳实践 ,即通过callback错误参数来处理错误,并让大多数exception冒出来并使应用程序崩溃,因为没有真正的一个干净的恢复方式。 我现在正在和一个使用Q的开发人员一起工作,他正在使用Q.nfbind来调用一些基于callback的函数。 但是,这给我头痛的error handling。 例如,假设我有一个可以callback的错误的函数: function doSomething(x, callback) { dbpool.acquire(function(err, conn) { if (err) return callback(err); conn.query('INSERT INTO some_table (x) VALUES (?)', [x], function(err, result) { dbpool.release(conn); if (err) return callback(err); callback(null, result.insertId); }); } var qDoSomething = Q.nfbind(doSomething); 随着QI可以然后调用qDoSomething并处理错误确定: qDoSomething('abc') .fail(function(err) { … }); 现在假设我工作得太晚了一晚,并且在查询之前在我的doSomething()函数中检查了这样的代码: var foo; foo.doAnotherThing(); 在我的前Q世界,这将是不好的。 将抛出exception,这将导致应用程序崩溃,并将永远重新启动。 但是,一旦应用程序重新启动,它将至less有效,直到此代码path再次被击中。 […]

如何使用promise在express.js中正确处理错误(string或对象)

我不是在我的第一个express.js应用程序,但我仍然找出最强大的方法来处理错误。 由于io.js是几个月的现实,我使用原生Promise来帮助自己asynchronous,下面的代码反映了这一点。 我的error handling中间件如下: router.use(function (err, req, res, next) { // in case err.custom is present, means is an "handled" Error, created by developers if (!!err.custom) { return res.status(err.code).json(err.message); } if (err instanceof Error) { console.error(err.stack); return res.status(500).send('Runtime Error'); // should be reported! } // last but not least, validation error res.status(400).send(err); }); 一个示例控制器是这样写的: function […]

在Mean.js中使用Node的域

我试图让我的平均应用程序准备好生产。 该应用程序build立在Mean.js样板上。 根据我的理解,MEAN.js使用Forever.js在发生错误后重新启动应用程序(尽pipe准备生成Mean.js的文档严重缺乏)。 然而,似乎处理应用程序崩溃的build议方式是使用节点域与群集结合使用。 这里有几个参考文献: 这是来自Node上的废弃的 uncaughtException事件的网页: 请注意,uncaughtException是exception处理的非常粗暴的机制。 不要使用它,而是使用域名。 Node.js域名: https : //nodejs.org/api/domain.html \ HTTP://shapeshed.com/uncaught-exceptions-in-node/ 等等 尽pipe我发现了很多关于使用域名的build议,但是我还没有find一个能够告诉我在域名应用中需要做些什么的工作,尤其是那些已经开发出来的域名。 问题 我需要做什么来将节点域整合到Mean.js应用程序中? 从我收集的(从Node.js域的网页和这里 ),你将会进入到Mean.js项目的根目录下的server.js ,并做类似的事情: var cluster = require('cluster'); var PORT = +process.env.PORT || 1337; if (cluster.isMaster) { //Fork the master as many times as required. cluster.fork(); cluster.fork(); cluster.on('disconnect', function(worker) { console.error('disconnect!'); cluster.fork(); }); } else { var […]

如何在asynchronous操作期间使Express.jslogging错误

我有这样的代码: exports.listSavedThreads = function (req, res) { SavedThread.find({}).exec().then(function (data) { wat.map(); res.render('home/listSavedThreads'); }); }; wat是未定义的variables,所以上面的代码不起作用,并且res.render()永远不会被调用,但是没有任何东西被打印到控制台,它静静地失败,浏览器被无限加载。 如果我没有承诺就这样做: exports.listSavedThreads = function (req, res) { wat.map(); res.render('home/listSavedThreads'); }; 像往常一样,错误被打印到控制台和浏览器。 我能够打印错误的唯一方法是使用try/catch : exports.listSavedThreads = function (req, res) { SavedThread.find({}).exec().then(function (data) { try { wat.map(); res.render('home/listSavedThreads'); } catch(e) { console.log('Error: ', e); } }); }; 然后在控制台中我看到: Error: [ReferenceError: wat is […]

需要系统地处理NodeJS项目中的错误/exception/拒绝

背景信息 我有一个新的项目,我将会提供可以安装的多个不同的(可选的)软件包,除了核心软件包(只有手册软件包)之外,所有这些软件包都可以被安装。 其他软件包只是与核心进行交互。 该项目只是为了跟踪数据列表(不是很具体,我知道,但这些细节是不需要的)。 附加软件包确定数据列表如何与之交互。 核心包只包含所有主要的JSfunction和数据库模型以及authentication。 其他的包裹和那些捆绑在一起。 比方说,你只想把它作为一个标准的网页,你可以安装webui包,这将绑定到核心 ,并创build一个web应用程序 如果你想创build一个API,你可以安装restapi包,它创build了RESTful接口; 您也可以安装spaui包,它将与RESTful接口进行交互,该接口从核心获取数据 这些插件包我会叫“外观”包。 所有你真正需要从上面推断出来的是核心是一个独立的包装外观包,它处理的核心function(数据库的东西,authentication,授权等) 问题 核心可以使用promises或callback函数,并且返回失败的exception,然后使用任何Facade包与核心交互将处理exception/错误(显示HTTP错误页面,返回RESTful错误结果等)。 由于处理错误的包不同于返回错误的包,因此需要有一个系统的方法来知道返回的错误types ,因此可以正确处理(EG:webui / restui包应该知道如果需要显示HTTP 500,HTTP 403,HTTP 409等)。 显然核心只是返回new Error('Something broke') ,那么外观包并不真正知道它是什么types的错误,除非他们把文本保存在某个地方,并且可以与错误代码相匹配。 题 什么是处理这个最好的方法? 我一直无法find任何完成这个我想要的东西.. 我最终开始了自己的尝试..(下图) 我的可能的解决scheme(如果这是足够的,只需确认) 我创build了一个新的AppErrorexceptiontypes,而不是用简单的string返回AppErrorexception,而是提供一个将该exception与错误消息,错误types等关联的错误代码 。 这是一个AppErrorexception的例子: exports.createThing = ( name, data ) => { return new Promise( ( res, rej ) => { if( doesItExist( name ) […]

node.js – 捕获在mongoosecallback中引发的错误

在我的控制器中,我有一个终点函数调用另一个函数,期望得到一个结果或从被调用函数捕获错误。 exports.createInvites = (req, res) => { // code… try { generateInvitations(requirements, data => { res.status(200).json({data}); }); } catch (err) { console.log(`caught the error: ${err}`); return res.status(500).json(err); } } 在被调用函数generateInvites ,我使用mongoose把生成的对象保存到mongodb中,如果有的话就抛出一个错误。 function generateInvitations(requirements, cb) { const { expirationDate, credits, numOfUse, numOfInvites } = requirements; let invitationCodes = []; for (let i = 0; i < […]

使用Cloudant Lite服务在Bluemix上的Node.js Web应用程序中收到500个查询错误

当我执行从关联的Web应用程序访问我的Cloudant数据库的某个函数时,在Node.js控制台窗口中出现以下错误: “错误:您已经超出了查询类每秒5个请求的当前限制”。 我的Chrome浏览器中出现相应的错误: “MethodHubFrontend-1.1.0.js:32 POST http://cognitivehub.w3ibm.mybluemix.net/api/export/archive 500(内部服务器错误)”。 我们的应用程序使用Cloudant Lite服务在Bluemix Dedicated(CIO)上运行。 什么是造成这些错误? 是否因为我们超过了Cloudant Lite中每秒5个查询吞吐量限制? Cloudant标准中有一个选项,除了每秒提供50个查询,我们可以使用吗? 我们应该如何处理我们的Node.js服务器中的错误,以便返回3xx错误代码而不是500错误代码?

在node.js中处理PromiseRejection

我刚开始第一次使用JavaScript。 从谷歌search,我只能find通过你写的函数处理承诺拒绝的例子。 我的问题是 app.getInput("key"); 不是由我写的。 我希望能够处理我的代码中被拒绝的承诺。 我的大脑目前在“获取JavaScript”方面遇到了麻烦。 我有这个function(在jovo框架中) var content = app.getInput('content'); 我得到错误“TypeError:无法读取未定义的属性'内容”。 我知道为什么我得到这个错误,我只是想能够处理没有内容的情况。 它也说“未处理的推翻拒绝警告:未处理的承诺拒绝” 我只是想写一些类似的东西 var content = "null"; content = testFunc().then(() => { console.log('resolved content!'); }).catch((err) => { console.log('error content'); content = "null"; }); function testFunc(){ return app.getInput('content'); }

从节点连接中抛出错误并将其捕获到服务器error handling程序中

我想通过抛出服务器级错误来处理不喜欢传入数据格式的情况。 var net = require('net'); var server = net.createServer(function(c) { c.on('data', function() { // ***THROW ERROR*** }); }); server.on('error', function (e) { // ***CATCH IT**** }); server.listen(8124); 该示例是对节点文档中的复制和粘贴的快速修改。 我已经尝试throw new Error("error"); 无济于事!

expression错误中间件不处理从promise.done()抛出的错误

如果我抛出一个错误,express使用connect errorHandler中间件很好地呈现它。 exports.list = function(req, res){ throw new Error('asdf'); res.send("doesn't get here because Error is thrown synchronously"); }; 当我在一个承诺中抛出一个错误,它将被忽略(这对我来说是有意义的)。 exports.list = function(req, res){ Q = require('q'); Q.fcall(function(){ throw new Error('asdf'); }); res.send("we get here because our exception was thrown async"); }; 但是,如果我在一个promise中抛出一个Error并且调用“done”节点崩溃,因为这个exception不被中间件捕获。 exports.list = function(req, res){ Q = require('q'); Q.fcall(function(){ throw new Error('asdf'); }).done(); res.send("This […]