我对在JavaScript中制作自定义Error类的"正确"方法的理解是这样的:
function MyError(message) {
this.name = "MyError";
this.message = message || "Default Message";
}
MyError.prototype = new Error();
MyError.prototype.constructor = MyError;
Run Code Online (Sandbox Code Playgroud)
(代码片段来自https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error.)
使用NodeJS,如果我尝试检查这种类型的错误,如:
var err = new MyError("whoops");
assert.ifError(err);
Run Code Online (Sandbox Code Playgroud)
...回溯将显示我在编译时创建的Error对象的上下文,它是MyError的原型,而不是我用"new MyError()"创建的MyError对象.
有没有什么方法可以获得实际错误的正确回溯数据,而不是原型?
我有一个Web服务器,可以读写磁盘上的数据文件.我想只在一个Web请求中写入一个文件.
这是一个示例程序,说明了我的问题.它将状态文件保存在"/tmp/rw.txt"中,并在每次Web命中时增加整数内容.运行此程序,然后运行类似的程序ab -n 10000 -c 1000 http://localhost:3000/,表明通过多次点击从文件中读取相同的值,并且它被多次写入.
注意:我知道flock()和fs-ext.但是,flock()会将文件锁定到当前进程; 因为这里的所有访问都在同一个进程中,所以flock()不起作用(并且大大复杂化了这个例子).
另请注意,我通常使用express,async等来完成大部分工作; 为了举例,只是坚持基础.
var http = require("http"),
fs = require("fs");
var stateFile = "/tmp/rw.txt";
var server = http.createServer(function(req, res) {
var writeNum = function(num) {
var ns = num.toString(10);
console.log("Writing " + ns);
fs.writeFile(stateFile, ns, function(err) {
if (err) {
res.writeHead(500, {"Content-Type": "text/plain"});
res.end(err.message);
} else {
res.writeHead(200, {"Content-Type": "text/plain"});
res.end(ns);
}
});
};
switch (req.url) {
case "/reset":
writeNum(0);
break;
case "/":
fs.readFile(stateFile, function(err, data) {
if …Run Code Online (Sandbox Code Playgroud)