我遇到了一个非常不寻常的问题,我似乎无法找到很多帮助。在我的Express应用程序中,我使用自己的基于文件的会话存储处理程序,但是我遇到了set函数的问题。
最初,我用异步方式写入磁盘:
store.prototype.set = function( session_id, session, cb ) {
...
// save content to disk
g.modules.fs.writeFile( file, content, function( error ) {
if ( error ) {
return cb && cb( error );
}
cb && cb();
});
};
然而,我发现了一个问题。如果正在处理的请求的调用堆栈中有任何未处理的异常,则writeFile
将无法完成,并且磁盘上的会话文件已损坏。
然后我切换到同步方式:
store.prototype.set = function( session_id, session, cb ) {
...
// save content to disk
g.modules.fs.writeFileSync( file, content );
cb && cb();
};
然而,这引起了一个新问题。服务器将内容发送回客户端似乎存在问题,因为Chrome说ERR_CONTENT_LENGTH_MISMATCH
。
所以我的第一个问题是哪种写入方法通常用于节点应用程序中用于会话存储,异步还是同步?如果是前者,我怎样才能避免退出进程的未处理异常上的文件损坏?如果是后者,为什么Express将内容发送回客户端会出现问题?