时间过得很快,6月和7月忙的不可开交,糟心的事儿也是不少,杭州大连来回飞,也是呵呵。

希望下个阶段能沉浸下来,接着学自己想学的。记一下上几周用了几天时间写的课设。因为课设的缘故,所以在短时间里了解下express+mongodb的组合,给APP端搭了个简易的服务器,也开了后台网站的web服务。简单总结一下开发过程中遇到的坑。

一、关于express
了解node.js有半年多,第一次用node.js的框架来写server,了解不是很深,简单看了一下文档之后就可以上手了,开发入门难度低。
1.运行
express init之后以为是node app.js命令运行项目,结果却并不是。app.js是项目入口文件不错,但是本身也是一个module模块,app.js的代码里面并没有listenserver的操作,express的脚手架命令把项目启动交给了bin/www文件,需要通过npm start启动应用。
通过npm start的应用好像并不能实时重启[?],所以可以把www文件转移至[new]start.js并运行node start.js,就可通过supervisor或者nodemon来自动监控&重启应用了。

2.中间件
express是基于中间件的。通过引入中间件执行处理函数,例如在处理一个get请求的时候会根据路由情况在app.js里顺序执行函数,app.use('/admin', admin)就会处理所有localhost/admin下的请求,具体的第二级路由处理就交给了route/admin.js。这个课设里我只自己定义了一个中间件cookie-checker,用于登录识别。在java或者php里面可以通过filter或者入口模块检测的方式来检测cookie、判断登录,express里面就刚简化了,直接定义个cookie-checker中间件,放在了app.use('/api',api)和app.use('/admin', admin)中间,这样所有的api请求(app端)无需cookie检测,而admin下的请求全部需要经过登录检测操作,整个中间件的代码如下:

exports = module.exports = function(){
return function(req,res,next){
if( req.cookies.gid == undefined || req.cookies.gid == null ){
if( req.path != "/admin/login" ){
res.redirect("/admin/login");
}
else{
next();
}
}
else{
next();
}
}
}

3.模块引用
express里面对模块互相引用目测并没有做什么处理,当然产生互相引用肯定是我自己代码的原因。
互相引用具体的位置忘了是哪里了,但是大概是articleModule.js和favoriteModule.js造成的,在处理mongodb的连表查询时候的问题。mongodb的连表也是糟心,后来也没做连表,直接把favorite操作的记录都add进一张大表里了。之前两年一直用的是mysql或者是sqlserver,在实际应用里nosql的精神还是没有领会,设计表的时候觉得还挺简单,实际应用起来就发现跟mysql、sqlserver完全不是一个路数,连表、主键、外键都没有。

4.mvc的模式
现在写个server不基于mvc都不好意思说自己是写server的。express里面做的还是不错的,route、view、modules。
route下是路由文件,用于处理路由请求,并且根据请求调用对应module的函数。所有的请求都是通过req、res、next来操作,内部函数大多是基于回调的。view下所有的模板文件,课设里面使用的是jade,感觉和smarty等模板语言没什么功能区别,映射、分布视图、公共模块、模板继承、if-else等逻辑判断,该有的都有,jade的语法倒是变了,写的不是html标签,节点名称、缩进控制层级。modules下自定义的原型模块,例如课设里面大概有这么几个module:ad、article、word、user等,模块内部引入mongoose文件完成增删改查操作,增删改查数据库的函数都是异步的,所以在文件下大部分函数也都是基于回调的。
例如API路由下的api/wordItem?id=5x23434fa5sk4dhid7a,获取的是某条句子的信息。在api.js里:

/* 单句(id) api/wordItem?id=5x23434fa5sk4dhid7a */
router.get('/wordItem', function(req, res, next) {
var _id = req.query.id;
var _user = req.query.uid || -1;
word.findById(_id,function(err,data){
if( err ){
data._id = -1;
}
favorite.check({t_id:data._id,user_id:_user},function(_f){
data.flag = _f;
res.send( data );
});
});
});

在word.js里面:

//根据ID获取word条目
var Word = mongodb.mongoose.model("word", wordSchema);
var wordModel = function(){};
//...
wordModel.prototype.findById = function(_id,callback){
var id = _id || 1;
Word.findOne({'_id':id}, function(err, obj){
var itemdata = obj || {_id:-1} ;
favorite.getCount({t_id:itemdata._id},function(err,count){
itemdata.favorite = count ;
callback(err,itemdata);
});
});
};

路由判断---调用word原型的findById函数---函数内部执行mongoose封装的WordModel的findOne操作,查询结束后执行回调,将err参数和data参数作为形参传递给回调函数。

5.文件上传
用的是multer中间件,通过json配置直接处理了文件存储位置、上传回调。

app.use(multer({
dest: 'public/upload/',
limits: {
fieldNameSize: 100,
files: 2,
fields: 5
},
onFileUploadComplete: function (file, req, res) {
res.flag = true;
res.fname = file.name;
},
onError: function (error, next) {
res.flag = false;
res.fname = "";
next(error);
}
}));

把public文件夹设置为静态路由:

app.use(express.static(path.join(__dirname, 'public')));

[node.js]express+mongoose+mongodb的开发笔记的更多相关文章

  1. React+Node.js+Express+mongoskin+MongoDB

    首发:个人博客,更新&纠错&回复 采用React + Node.js + Express + mongoskin + MongoDB技术开发的一个示例,演示地址在这里,项目源码在这里. ...

  2. node.js+express+mongoose实现用户增删查改案例

    node.js+express+mongodb对用户进行增删查改 一.用到的相关技术 使用 Node.js 的 express 框架搭建web服务 使用 express 中间件 body-parse ...

  3. node.js + express(ejs) + mongodb(mongoose) 增删改实例

    MongoDB 安装步骤总结: 1.解压目录到d盘 mongodb 2.安装目录的下新建文件mongo.config文件 ##store data here dbpath=D:\mongodb\dat ...

  4. [译]简单得不得了的教程-一步一步用 NODE.JS, EXPRESS, JADE, MONGODB 搭建一个网站

    原文: http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/ 原文的源代码在此 太多的教程教你些一个Hello, World!了, ...

  5. node.js(express)连接mongoDB入门指导

    一.写在前面 人人都想成为全栈码农,作为一个web前端开发人员,通往全栈的简洁之路,貌似就是node.js了.前段时间学习了node.js,来谈谈新手如何快速的搭建自己的web服务,开启全栈之路. 二 ...

  6. [MEAN Stack] First API -- 1. with Node.js, Express and MongoDB

    Learn how to import data into your MongoDB and then use Express to serve a simple Node.js API. Impor ...

  7. [转] Creating a Simple RESTful Web App with Node.js, Express, and MongoDB

    You can find/fork the sample project on GitHub Hey! This and all my other tutorials will soon be mov ...

  8. Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识

    目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...

  9. Nodejs学习笔记(六)—Node.js + Express 构建网站预备知识

    前言 前面经过五篇Node.js的学习,基本可以开始动手构建一个网站应用了,先用这一篇了解一些构建网站的知识! 主要是些基础的东西... 如何去创建路由规则.如何去提交表单并接收表单项的值.如何去给密 ...

随机推荐

  1. 关于jQuery的$.proxy()应用.

    今天在看<<锋利的jQuery>>时看到了proxy()的使用,感觉很模糊,就到处找资料. jQuery的源码也没看明白. 不过总算明白了proxy的用法了; <inpu ...

  2. Shell脚本的调试方法

    Shell脚本的调试方法 Shell提供了一些用于调试脚本的选项,如下所示: -n    读一遍脚本中的命令但不执行,用于检查脚本中的语法错误 -v    一边执行脚本,一边将执行过的脚本命令打印到标 ...

  3. 跟我学算法-match-LSTM(向唐老师看齐)

    对于match-lstm,将hi文本与输出的match-lstm(由si,hi,qi)组合重新输入到LSTM网络中,以端对端的操作理念. 参考的博客:https://blog.csdn.net/lad ...

  4. 图像特征与描述子(直方图, 聚类, 边缘检测, 兴趣点/关键点, Harris角点, 斑点(Blob), SIFI, 纹理特征)

    1.直方图 用于计算图片特征,表达, 使得数据具有总结性, 颜色直方图对数据空间进行量化,好比10个bin 2. 聚类 类内对象的相关性高 类间对象的相关性差 常用算法:kmeans, EM算法, m ...

  5. 迷你MVVM框架 avalonjs 0.98发布

    在本版本中,avalon侧重于对组件开发的支持,可用控件达到12个,末来将大力投入对GRID,TREE等重型UI的开发中. 添加ms-widget绑定,废弃ms-ui绑定 为ms-include添加跨 ...

  6. Linux中shell变量$0,$?等含义

    linux中shell变量$#,$@,$0,$1,$2的基本含义: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行 ...

  7. SpringBoot进行单元测试

    SpringBoot进行单元测试,需要在maven中加入以下依赖 <dependency> <groupId>org.springframework.boot</grou ...

  8. redis在Web中的使用

    redis是一个键值对数据库,用于缓存数据. redis是一个key-value存储系统.和Memcached数据库类似,它支持存储的value类型相对更多,包括string(字符串).list(链表 ...

  9. Python slice() 函数

    Python slice() 函数  Python 内置函数 描述 slice() 函数实现切片对象,主要用在切片操作函数里的参数传递. 语法 slice 语法: class slice(stop) ...

  10. 自制精排 ePub 集、不定期更新(UPDATA-2015-8-2)

    说明 排版不说最好,上乘是必须的. 段落空行 首行缩进 具备清爽元数据 包含高清封面.目录 图片居中,图片标题以下标形式居中位于图片下* 支持多看/Kindle原生系统弹出注释,其他软件跳转注释* 各 ...