我的nodejs处女项目 ,求吐槽
发布于 11 年前 作者 cicada 10354 次浏览 最后一次编辑是 8 年前

最近写项目,越发觉得php累赘,就开始学习nodejs,最开始找到的就是这个开源的社区,看了一下源码布局,觉得和php有的拼了,就放弃了。然后尝试直接用express和其他几个module做了自己的第一个项目,火星问答,求大家吐槽。

终于受不了备案的摧残了,买了linode在东京的vps,现在测试速度还可以


更新:

火星问答最初版发布后,意外的受到很多人喜欢,不知不觉此项目已经走过100多天了,把最新进展update一下吧

1、完善了答题基本功能,并适配到pc、webapp、qq开放平台等多种平台 2、积累了更多有意思、有营养的题目 3、增加了很多辅助功能,比如:站内通信、勋章奖励 4、推出新的答题方式:极限30秒


更新:

上线一个关键栏目 火星人:用户可以根据兴趣和爱好经营自己的题库,查看和管理谁在答自己题,谁喜欢自己的题,谁的成绩最好;答题人可以选择喜欢的题库和人进行跟进,希望此功能能让臭味相投的人形成自己的圈子。

46 回复

有啥问题,大家给点意见啊

文件上传使用 express 很简单啊,直接form post,用express里的bodyparse 解析就可以了,当然这个项目里用到了ajax方式,在前端使用了 jquery.form 插件,然后用js控制提交文件,后台接收处理后返回json格式结果供前台处理

@thesadboy我在express里限制的,bodyparser 里设置 limit 参数

@thesadboy 类型的话,简单写个filter,过滤一下 mime 类型或者文件后缀 就可以了

@thesadboy 对,直接操作里面的文件就可以,都封装好了

看起来不错~越来越多的 bsv3了~

这项目创意不错. 稍加推广应该会有用户驶入

如果能放到github给我们共享共享就爽歪歪了.

请问有后台么

呵呵,不是不想共享,因为这是学习nodejs的首个项目,现在结构和代码都比较笨拙,里面也没有必要的代码诠释,怕误人子弟,而且代码公开后,可能会暴露N多漏洞,害人害己啊。过段时间完善和稳定了,整理一下发上去。

有个简单后台,可以查看用户和审核题目等功能,很必要的功能会先添加,可有可无的功能就懒得弄了

想法,效果真还不错

@thesadboy是不是安全隐患,关键是看你怎么处理文件和设置相应的安全权限,只要是允许上传理论上都有风险

@thesadboy设置图片所在的文件夹内文件不可执行,通过 chmod命令可以实现

发现一严重bug,回答的时候错误返回json里面有个answer,哈哈哈

哈哈,多谢提醒,返回answer是因为对于逻辑推理题等非标准答案的题目,用户回答后要给出答案做参考,忘了屏蔽其他类型的题目,会尽快修复

已经修复,多谢了

郁闷死了,国内icp备案麻烦的要死,上火了,干脆放到国外啊,谁推荐个好用的vps?

host virtual是速度最快,延迟最低的,不过比较贵。20$一个月。 最近出的digital ocean很便宜但是延迟感觉有点大,比linode还要延迟点

20$和linode一样啊,linode都说稳定,但是好像延时比较大啊

响应式嗷,界面不错。 /devdata/www/iuser ubuntu的系统么?

呵呵,着都被你整出来了啊,通过错误测试么?因为还在开发阶段,所以就打开调试了。正在试用linode ,打算搬迁了,被国内idc玩弄的受不了了

用户设置里更新头像就报代码内部错误 , 没有修改密码的功能 !!!

多谢提醒,头像问题已经修复。修改密码想稍等一下,因为现在还没有加入邮箱验证功能

还是mysql,因为其他项目用mysql了,而且刚开始学nodejs,如果再用 mongodb ,感觉有些吃力

看起来是部署在meteor的服务器上,favicon都没改

看到这个facicon挺漂亮的就没有改

update 一下最新状态

做的很完整了已经,创意也很好!

用的哪家的服务器,速度很快啊。

楼主有兴趣来我们公司吗? yunshipei.com

挖墙角的节奏啊。

linode ,东京

谢谢

除了创意,bootstrap网站风格不错,其他很多设计架构方面还是业余啊,例如前台:javascript规范,后台:接口设计规范,数据安全等… 你的答案我全部都能看的到,我写了一个智能答题的东西,完全无脑// 另外缺少推送.题目设计也太差,你可以参考我很久之前弄的这个题目设计风格:http://202.175.189.115/ers_survey/home/public/#survey-edit?id=2

多谢提醒。请问一下,答案如何看到的?至于规范类的东西,因为是个人开发,怎么方便怎么来。你说的缺少推送是指什么?手机推送?你的那个题目设计看了,很厉害,只是太专业的样子,作为工程师觉得很完善,但是面向用户使用,不知道他们什么感受了

@cicada 我说的推送是用户自定义感兴趣的话题进行回答,可以推送到手机,当然也可以推送到web平台中,答案我是怎么获取的,其实很简单,比如你有一个这样的题目http://www.huoxingwenda.com/question/8311389841431.html 答案:http://www.huoxingwenda.com/question/answer?question=8311389841431&answer=hxa&time=1 只要把question的值改成相应的问题就可以了 另外你的js我也有看过,安全性根本没有,哈哈… function answer(){ // if(!isLogin()) return; var $btn=$(this); if($btn.hasClass(‘disabled’)){ return; } var $input=$(’#answerinput’); var question=$input.attr(‘data-my’); var myanswer=$input.val(); var getanswer=false; if($.trim(myanswer) ===’’){ return; }else if(myanswer === “hxa”){ getanswer=true; }

var time=$(’#countup’).length>0?$(’#countup’).countup(‘time’)[0]:0; if(getanswer){ time=300; } $btn.addClass(‘disabled’); var url=’/question/answer’; $.getJSON(url,{question:question,answer:myanswer,time:time},function(res){

var $box=$btn.parents(’#answerbox’); var $alist=$box.find(’.answerlist’); if($alist.length === 0){ $alist=$(’<div class=“answerlist”></div>’); $box.append($alist); } $alist.find(’.alert’).remove(); var markup=’’; if(res.state==‘ok’){ updateUserScore(); if(res.message.state===1){ if(getanswer){ myanswer=res.message.answer.split(" || “)[0]; } if($(’#countup’).length>0) $(’#countup’).countup(‘stop’); markup=’<span class=“ianswer label label-success”>’+myanswer+’ <i class=“glyphicon glyphicon-ok icon-white”></i></span>’; var minute=Math.floor(time/60); var second=time-minute*60; minute=minute===0?’’:minute+’ 分’; second=second+’ 秒’; var imessage=‘恭喜你,回答正确,你共用时’+minute+second+”。"; if(getanswer){ imessage=“查看答案及解释,此题累计减分”+res.message.score+’ 分。’; }else if(res.message.score!==null){ imessage+=“此题累计获得 “+res.message.score+’ 分。’; }else if(!loginState){ imessage+=“你尚未登录,登录用户可获得更多功能。”; } if(res.message.honor && res.message.honor.length>0){ var myhonor=res.message.honor, honorName=””,honorImg="",idx; for(idx=0;idx<myhonor.length;idx++){ honorName+=’ “’+HONORS[myhonor[idx]].name+’”’; honorImg+=’ <span class=“imedal ‘+HONORS[myhonor[idx]].cls+’” title="’+HONORS[myhonor[idx]].name+’" data_my="’+myhonor[idx]+’"> </span>’; } imessage+=‘你赢得了’+honorName+’ 勋章 ‘+honorImg; } var answertip=res.message.answertip || ‘无’; imessage+=’<div class=“answertip”><span class=“label label-info”>答案解释</span> ‘+answertip+’</div>’; if(res.message.type===4){ imessage=‘回答成功,此题奖励 20分’; markup=’<div class=“clearfix alert alert-success marginTop”> ‘+imessage+’</div>’; }else{ markup+=’<div class=“clearfix alert alert-success marginTop”> ‘+imessage+’</div>’; } $alist.append(markup); }else{ $btn.removeClass(‘disabled’); markup=’<span class=“ianswer label label-danger”>’+myanswer+’ <i class=“glyphicon glyphicon-remove icon-white”></i></span>’; var imess=‘嘿嘿,回答错误! ‘; if(res.message.scorePlus===0){ imess+=‘此题你已经累计减了25,不再继续减分了’; }else{ if(res.message.score!==null){ imess+=res.message.scorePlus+’ 分’; }else if(!loginState){ imess+=“你尚未登录,登录用户可获得更多功能”; } } markup+=’<div class=“clearfix alert alert-danger marginTop”>’+imess+’</div>’; $alist.append(markup); } $input.val(’’); }else{ $btn.removeClass(‘disabled’); markup+=’<div class=“clearfix alert alert-danger marginTop”>’+res.message+’</div>’; $alist.append(markup); } }); }

@cicada 另外我说的那种智能题目设计那样做的目的是我之前参考国外最先进的题目设计思路研发的,只是建议,因为很多人可以同时设计同一类型的题目,我之前那样做是为了及时性,不然像你那样就达不到那样的效果.只能一道题一道题的编辑.

@ym1623 哈哈,多谢你的认真,你说的获取答案的方式我开始设计时就知道的,之所以还这么设计是有其他方面的考虑,而且真要封堵这个漏洞,我后台再进行一次校验就可以解决,现在校验是在前台。如果能让工程师们看到开心,我也很开心啊。对安全性来说,这个项目基本没有考虑,否则我稍微混淆一下代码,就会加大解读难度,一个娱乐项目,让大家开心的,干嘛搞的像防贼啊。而且如果你持续使用此方法获得答案,后续对此帐号的副作用很快就会显现。

@ym1623 多人出题不在火星功能设计中,火星鼓励个性与想象力。如果你玩lol,可以看一下这个题,一个用户提交的:lol中最小气的人是谁(2个字)

@cicada 既然就是娱乐,那就没有任何吐槽的地方可言了,哈哈

@ym1623 不是这个意思,很喜欢你的吐槽,后面能改进的会改进,app快出来了,到时再请你吐槽

回到顶部