Tag: error handling

在Node.js中公开和组合错误的最好方法是什么?

我正在编写一个与REST API交谈的模块,由于REST API提供了很好的语义错误响应(例如403与503),我想将这些语义错误传递给调用者。 (编辑:我的意思是,调用者应该能够以编程方式了解错误的原因,并采取相应的行动,例如显示适当的用户界面。) 对我来说最好的办法是什么? 为这些语义创build我自己的Error子类,例如mymodule.ForbiddenError , mymodule.ServiceUnavailableError ? 然后调用者会检查instanceof来派生语义。 这在静态types语言(如C#和Java)中最为典型。 将例如mymoduleCode属性添加到标准的Error实例,使用语义string,如'Forbidden'或'ServiceUnavailable' 。 Node.js自己做这个,例如code: 'ECONNREFUSED' 。 其他方式? == 我正在编写另一个模块,它包装了第一个模块。 我不想直接暴露内部模块的错误,但是为了可debugging性,编写/包装它们会很好。 对我来说最好的办法是什么? 将例如internalError属性添加到引用内部模块的Error实例的Error实例中。 再次C#和Java这样做。 ( Exception#InnerException / Throwable#cause ) 其他方式? 但是我见过的大多数工具只显示Error实例的stack属性,所以这些数据在这些情况下会丢失。 有没有一个典型的/传统的方式已经存在?

logging捕获的错误与Node.js中的未捕获错误完全相同

比方说,我有以下文件error.js : // this is invalid code var a: 0; 然后在我的main.js我需要该文件: require("./error.js"); 我从Node.js得到一个很好,简单易懂的错误消息: $ node main.js /home/jfischer/error.js:2 var a: 0; ^ SyntaxError: Unexpected token : at exports.runInThisContext (vm.js:53:16) at Module._compile (module.js:413:25) at Object.Module._extensions..js (module.js:452:10) at Module.load (module.js:355:32) at Function.Module._load (module.js:310:12) at Module.require (module.js:365:17) at require (module.js:384:17) at Object.<anonymous> (/home/jfischer/main.js:1:63) at Module._compile (module.js:434:26) at Object.Module._extensions..js (module.js:452:10) […]

error handling中间件并不总是工作

我正在使用Express构build一个示例网站,我碰到一些我不太明白的东西。 如果我理解正确,error handling中间件应该是pipe道中的最后一个。 例如,工作得很好: var http = require('http'); var express = require('express'); var app = express(); app.set('view engine', 'jade'); app.set('views', './views'); app.use(express.static('./public')); http.createServer(app).listen(portNumber, function() { }); app.get('/hello', function(req, res) { res.send('Welcome!'); }); app.use(function(err, req, res, next) { res.status(500).send('something broke!'); }); app.get('/error', function(req, res, next) { somethingNonExistent(2016); }); 但是,如果我在http.createServer调用之前注册了中间件,但在所有其他中间件注册之后,它将不起作用 – 我的代码不会被调用: var http = require('http'); var […]

为什么Node.js不能捕捉到我的错误?

var api_friends_helper = require('./helper.js'); try{ api_friends_helper.do_stuff(function(result){ console.log('success'); }; }catch(err){ console.log('caught error'); //this doesn't hit! } 而在do_stuff里面,我有: function do_stuff(){ //If I put the throw here, it will catch it! insert_data('abc',function(){ throw new Error('haha'); }); } 它怎么从来没有logging“发现错误”? 相反,它将堆栈跟踪和错误对象打印到屏幕上: { stack: [Getter/Setter], arguments: undefined, type: undefined, message: 'haha' } Error: haha at /home/abc/kj/src/api/friends/helper.js:18:23 at /home/abc/kj/src/api/friends/db.js:44:13 at Query.<anonymous> (/home/abc/kj/src/node_modules/mysql/lib/client.js:108:11) […]

在基于express.js的应用程序中集中error handling

我最近刚开始开发一个基于express.js的应用程序,它也使用pg模块(https://github.com/brianc/node-postgres) 我也花了大量的时间,阅读关于节点和expression方法的error handling,正确devise中间件的好处等等。然而,一个反复出现的问题仍然让我不知所措。 说,我有以下路由器的方法: app.get("/:someThing/:someId", function(req, res, next) { pgClient.query("some SQL query", function(err, data) { if (err) { return next(err); } // some 500 handler will take it if (data.rows.length == 0) { next(); // send it over to a 404 handler } //finally, here we get the chance to do something with the data. […]

为什么不能stream行的JavaScript运行时处理同步的asynchronous脚本?

正如牛仔在这里的评论中所说的 ,我们都希望“用类似于这样的风格编写[非阻塞JavaScript]asynchronous代码: try { var foo = getSomething(); // async call that would normally block var bar = doSomething(foo); console.log(bar); } catch (error) { console.error(error); } “ 所以人们已经想出了解决这个问题的方法 callback库(例如asynchronous ) 许诺 事件模式 精简 域和 发电机 。 但是这些都不会像上面的同步代码那样简单易懂。 那么为什么JavaScript编译器/解释器不能阻止我们当前所知的“阻塞”语句呢? 那么,为什么JavaScript编译器/解释器不能处理上面的同步语法,如果我们把它写成asynchronous样式? 例如,在处理上面的getSomething() ,编译器/解释器可能只是说“这个语句是对[文件系统/networking资源/ …]的调用,所以我会记getSomething()听从那个调用的响应并在此同时继续我的事件循环“。 当调用返回时,执行可以继续执行doSomething() 。 您仍然会保留stream行的JavaScript运行时环境的所有基本function 单线程 事件循环 阻塞操作(I / O,networking,等待定时器)“asynchronous”处理 这只是对语法的一种调整,只要IT检测到一个asynchronous操作,解释器就可以暂停执行任何给定的代码,而不需要callback,代码只是在asynchronous调用后继续执行回报。 正如杰里米所说 JavaScript运行时没有任何事情会抢先暂停给定任务的执行,允许其他代码执行一段时间,然后恢复原来的任务 为什么不? (如在“为什么不能存在?”我对历史课不感兴趣) […]

节点中的错误,stderr,stdout有什么区别

我正在使用node.js并想要处理错误消息。 erro,stderr,stdout有什么区别? 当脚本shell,我redirectstderr,并发现有用的错误信息,并解决了问题。 我不清楚计算机的输出是什么types的概念。 任何人都可以用全面的方式解释吗? 谢谢。

如何在node.js中捕获utf-8解码错误?

我刚刚发现Node(testing:v0.8.23,当前git:v0.11.3-pre) 忽略了其缓冲区处理中的任何解码错误 ,用'\ufffd' (Unicodereplace字符)静默地replace了任何非utf8字符,而不是抛出关于非utf8input的exception。 因此, fs.readFile , process.stdin.setEncoding和朋友为您屏蔽了一大类错误的input错误。 不失败,但真的应该: > notValidUTF8 = new Buffer([ 128 ], 'binary') <Buffer 80> > decodedAsUTF8 = notValidUTF8.toString('utf8') // no exception thrown here! ' ' > decodedAsUTF8 === '\ufffd' true '\ufffd'是一个非常有效的字符,可以在合法的utf8中出现(如同ef bf bd ),所以在error handling中基于这个结果显示猴子补丁是不平凡的。 挖掘更深一层,看起来这是源于节点只是推迟到V8的string,而这些又有上述行为,V8没有任何外部世界充满外部编码的数据。 是否有节点模块或其他,让我赶上utf-8解码错误,最好与上下文有关在inputstring或缓冲区中发现错误的上下文?

自定义错误和蓝鸟捕获ErrorClass导致无意中的行为

我正在尝试实现自定义错误的模块。 应该可以使用这个模块在应用程序的require-statement中实例化一个单独的错误: var MyCustomError = require('custom-error')('MyCustomError'); 这是模块: 'use strict'; var _CACHE = {}; function initError(name) { function CustomError(message) { this.name = name; this.message = message; } CustomError.prototype = Object.create(Error.prototype); CustomError.prototype.constructor = CustomError; _CACHE[name] = CustomError; } function createCustomError(name) { if (!_CACHE[name]) { initError(name); } return _CACHE[name]; } module.exports = createCustomError; 上述的需求一class轮运作到目前为止。 现在,在我的服务中,我想明确地捕捉到这个错误: var MyCustomError = […]

节点,Express,域,未捕获的exception – 仍然丢失

我一直在读Node几个小时的exception处理。 我理解使用uncaughtException的缺点,我知道closures这个过程对于防止任何可能发生的“未知状态”是有好处的。 我明白,使用域是要走的路,我明白如何正确地实现域,特别是显式绑定 … …但我仍然没有得到任何结果只是基本的error handling。 我希望能够捕获任何未捕获的exception,以便logging。 我不介意杀死这个进程或其他被认为是“不可取的”的东西。 我只想要一个日志。 我不觉得我应该把所有的东西都放在try / catch中,或者用一些库来emit错误…如果我错了,请纠正我,我会改变我的方式。 我正在使用Node和Express,我有以下简单的代码: var express = require('express'); var domain = require('domain'); var serverDomain = domain.create(); serverDomain.on('error', function(err) { console.log("SERVER DOMAIN ERROR: " + err.message); }); serverDomain.run(function() { var app = express(); app.get('/testing', function() { app.nonExistent.call(); // this throws an error }); var server = app.listen(8000, […]