我在NodeJs中遇到了与instanceof有关的奇怪行为.我正在尝试创建一个模块,该模块抛出异常,这些异常可以通过使用模块捕获并基于异常类型进行处理.但是,测试类型" error instanceof mod.MyException " 的调用总是返回false.
mymodule.js:
function MyException() {}
MyException.prototype = new Error();
MyException.prototype.constructor = MyException;
function Foo() {
throw new MyException();
}
exports.Foo = Foo;
exports.MyException = MyException;
Run Code Online (Sandbox Code Playgroud)
myconsumingmodule.js
var mod = require('mymodule');
try {
mod.Foo();
} catch (error) {
if (error instanceof mod.MyException) { // always returns false
//do error specific handling (never executes)
return;
}
// generic handling
}
Run Code Online (Sandbox Code Playgroud)
如果我在mymodule.js中执行instanceof测试,那么它返回true
mymodule.js
var a = new MyException()
console.log(a instanceof MyException); //true
Run Code Online (Sandbox Code Playgroud)
但是,如果我在使用模块中创建一个异常并对其进行测试,则会将其正确识别为MyException,而在将其与另一个模块创建的异常进行比较时则不会.
myconsumingmodule.js
var mod = …Run Code Online (Sandbox Code Playgroud) 我有一个使用 MongoLab 插件托管在 Windows Azure 上的应用程序,我遇到了一个问题,即应用程序在我部署后运行良好,但是在几分钟不活动后,我收到一个数据库错误:
没有可用于使用 ReadPreference PRIMARY 查询的主副本集
在我重新启动相同模式返回的网站之前,此错误不会消失 - 直到错误返回几分钟后才能完美运行
我的基本应用代码:
mongoConnect(process.env.CUSTOMCONNSTR_MONGOLAB_URI, {
server: {
auto_reconnect: true,
socketOptions: {
socketTimeoutMS: 120000,
keepAlive: 1
}
},
replSet: {
socketOptions: {
socketTimeoutMS: 120000,
keepAlive: 1
}
}
}).then(function (db) {
//app configure ...
http.createServer(app).listen(app.get('port'), function () {
console.log("Express server listening on port " + app.get('port'));
});
});
Run Code Online (Sandbox Code Playgroud)
*mongoConnect 是 mongoclient.connect 的一个简单的“promisified”函数
我知道这是最佳实践,我正在与数据库建立一个连接,然后为所有请求重用该数据库对象。通过阅读https://support.mongolab.com/entries/23009358-Handling-dropped-connections-on-Windows-Azure 之类的内容,我将 sockettimeouts 设置为 2 分钟,以防止任何防火墙过早杀死套接字并自动重新连接到true 所以它们重新连接,但是这两种设置都不能解决问题。