我正在使用mongoose并试图设置一个自定义验证,告诉该属性是否需要(即非空)如果另一个属性值设置为某事.我正在使用以下代码:
thing: {
type: String,
validate: [
function validator(val) {
return this.type === 'other' && val === '';
}, '{PATH} is required'
]}
Run Code Online (Sandbox Code Playgroud)
{"type":"other", "thing":""}失败正确.{"type":"other", "thing": undefined}或{"type":"other", "thing": null}或{"type":"other"}将验证功能永远不会执行,而"无效"的数据被写入到数据库.我有一个应用程序,我正在Node.js编写,需要进行大量的配置和数据库调用,以处理用户数据.我遇到的问题是,在11,800多个函数调用之后,Node会抛出一个错误并退出进程.
错误说明:RangeError:超出最大调用堆栈大小
我很好奇是否有其他人已经出现这种情况,并知道他们是如何处理这个问题的.我已经开始将我的代码分解为几个额外的工作文件,但即便如此,每次处理数据节点时,它都需要触摸2个数据库(最多25次调用以更新各种表)并进行一些清理检查.
我完全愿意承认,如果是这种情况,我可能会做一些非最佳的事情,但如果有更优化的方式,我会很感激.
以下是我在数据上运行的代码示例:
app.post('/initspeaker', function(req, res) {
// if the Admin ID is not present ignore
if(req.body.xyzid!=config.adminid) {
res.send( {} );
return;
}
var gcnt = 0, dbsize = 0, goutput = [], goutputdata = [], xyzuserdataCallers = [];
xyz.loadbatchfile( xyz.getbatchurl("speakers", "csv"), function(data) {
var parsed = csv.parse(data);
console.log("lexicon", parsed[0]);
for(var i=1;i<parsed.length;i++) {
if(typeof parsed[i][0] != 'undefined' && parsed[i][0]!='name') {
var xyzevent = require('./lib/model/xyz_speaker').create(parsed[i], parsed[0]);
xyzevent.isPresenter = true;
goutput.push(xyzevent);
}
}
dbsize = goutput.length;
xyzuserdataCallers = [new xyzuserdata(), …Run Code Online (Sandbox Code Playgroud) 请假设'使用严格'; 并且还假设,JSLint已启用且错误不能被忽略.
我发现运算符和','启动列表更具可读性,
例如:
var i = 0
, j = 1
, someLongVariablename1
, someLongVariablename2
, someLongVariablename3
, someLongVariablename4;
if( (
'dcr' === cmd
&& (action)
&& ('get' === actionHttp || 'post' === actionHttp )
&& whatever
) { ... }
Run Code Online (Sandbox Code Playgroud)
因此我的问题
是:"使用严格"是否"坏线断裂"已经过时了?
编辑:'使用严格'; 不会阻止执行坏线破坏代码.它可以防止执行某些错误.
我看到JSLint和JSHint以不同的方式处理坏的断行.JSHint对我喜欢的语法更友好.
因此,对于正在研究此问题的其他人而言,这可能是一种解决方案.
node.js手册说:
如果设置了分离选项,则子进程将成为新进程组的领导者.这使得孩子可以在父母退出后继续跑步.
默认情况下,父级将等待已分离的子级退出.要防止父级等待给定的子级,请使用child.unref()方法,并且父级的事件循环不会将子级包含在其引用计数中.
当你将node.js子进程作为分离和未进行的启动时,使用单独的stdio如下:
var child = spawn('prg', [], { // child spawn options
detached: true,
stdio: [
'ignore', // stdin
fs.openSync( updateOutputFile, "w" ),
fs.openSync( updateErrorFile, "w" )
]
}
child.unref();
Run Code Online (Sandbox Code Playgroud)
然后杀死父节点,lsof显示父节点正在侦听的TCP/IP(网络)套接字仍然打开并正在侦听.他们在孩子被杀后立即关闭.
为什么会这样?
javascript ×2
couchdb ×1
express ×1
jslint ×1
mongoose ×1
node.js ×1
use-strict ×1
validation ×1