Nodejs express4.8之microblog学习笔记
Nodejs express4.8之microblog学习笔记
学习环境:
nodejs :4.4.3,express :4.13.4,mongoDB : 3.2.4,robomongo: 0.9.0-RC7
依赖
学习例子:
nswbmw的一个简单的博客
接下来,我将按照例子中的章节依次列出遇到的问题以及解决的方法。
第1章 一个简单的博客
1、windows下用set DEBUG=express:* node ./bin/www设置DEBUG环境变量,再用npm start访问页面,但是输出的信息太多了,所以我们干脆不设(使用“set DEBUG=”清除DEBUG环境变量),就用npm start,此时在bin/www里面的debug('Listening on ’ + bind)下面添加console.log('Listening on ’ + bind); 2、不必按照作者那样把建立服务器也弄到app.js里面来,就让它在bin/www里就好; 3、建议使用nodemon代替supervisor; 4、app.use(flash());要放在app.use(session({}))之前; 5、控制台会提示express-session的配置里面最好设置resave、saveUninitialized; 6、注册用户成功后,回调里面的user[0]改为user.ops[0],可以将user的结构打出来看看。
第3章 增加文件上传功能
如果你跟我一样使用的1.1.0的multer,那么请按照以下步骤增加上传功能: 1、index.js
var multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './public/images')
}
})
app.post('/upload', checkLogin);
app.post('/upload',multer({ storage: storage }).array('photos', 12), function (req, res) {
req.flash('success', '文件上传成功!');
res.redirect('/upload');
});
2、upload.ejs 所有file input的name都改为photos
第14章 增加头像
因为http://www.gravatar.com被墙了,所以把http://www.gravatar.com换成http://gravatar.duoshuo.com
第15章 增加转载功能和转载统计
给转载链接注册了路由响应并不需要Post.edit()
我的blog
Nodejs express4.8之microblog学习笔记
学习环境:
- nodejs: 4.4.3
- express: 4.13.4
- mongoDB: 3.2.4
- robomongo: 0.9.0-RC7
依赖
{
"dependencies": {
"express": "^4.13.4",
"mongoose": "^4.4.18",
"multer": "^1.1.0",
"ejs": "^2.3.4",
"connect-flash": "^0.1.1"
}
}
学习例子:
- nswbmw 的 一个简单的博客
接下来,我将按照例子中的章节依次列出遇到的问题以及解决的方法。
第1章 一个简单的博客
-
设置调试环境变量
- 在 Windows 下使用
set DEBUG=express:* node ./bin/www
设置调试环境变量。如果觉得输出信息太多,可以使用set DEBUG=
清除环境变量。 - 示例代码:
// bin/www var debug = require('debug')('myapp:server'); var http = require('http'); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ server.listen(port); server.on('error', onError); server.on('listening', () => { debug(`Listening on ${port}`); console.log(`Listening on ${port}`); });
- 在 Windows 下使用
-
分离服务器创建逻辑
- 不必将创建服务器的逻辑放入
app.js
,而是保持在bin/www
文件中。
- 不必将创建服务器的逻辑放入
-
使用 nodemon 替代 supervisor
- 使用
nodemon
来替代supervisor
,因为nodemon
更简洁且更易于维护。 - 安装
nodemon
:npm install -g nodemon
- 启动项目:
nodemon ./bin/www
- 使用
-
flash 中间件的使用顺序
- 确保
app.use(flash())
放在app.use(session({}))
之前。 - 示例代码:
// app.js const express = require('express'); const session = require('express-session'); const flash = require('connect-flash'); const app = express(); app.use(session({ secret: 'secret', resave: false, saveUninitialized: true })); app.use(flash());
- 确保
-
配置
express-session
- 配置
express-session
时,最好设置resave
和saveUninitialized
。 - 示例代码:
app.use(session({ secret: 'secret', resave: false, saveUninitialized: true }));
- 配置
-
处理用户注册
- 注册用户成功后,回调中的
user[0]
应改为user.ops[0]
。 - 示例代码:
User.findOne({ username: req.body.username }, function(err, user) { if (err) return next(err); if (user) { req.flash('error', '用户名已存在'); res.redirect('/'); } else { var newUser = new User(req.body.user); newUser.save(function(err) { if (err) return next(err); req.flash('success', '注册成功'); res.redirect('/'); }); } });
- 注册用户成功后,回调中的
第3章 增加文件上传功能
-
配置 Multer
- 使用 Multer 处理文件上传。
- 示例代码:
// index.js var multer = require('multer'); var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './public/images'); }, filename: function (req, file, cb) { cb(null, file.fieldname + '-' + Date.now()); } }); var upload = multer({ storage: storage }); app.post('/upload', checkLogin, upload.array('photos', 12), function (req, res) { req.flash('success', '文件上传成功!'); res.redirect('/upload'); });
-
修改表单字段名
- 所有
file
输入字段的name
属性应改为photos
。 - 示例代码:
<!-- upload.ejs --> <input type="file" name="photos" multiple>
- 所有
第14章 增加头像
- 如果
http://www.gravatar.com
被墙了,可以将其替换为http://gravatar.duoshuo.com
。
第15章 增加转载功能和转载统计
- 给转载链接注册路由响应时,不需要调用
Post.edit()
。
我的 blog
- 你可以查看我的 blog 实现 这里。
一转眼竟然 express 都 4.8 了,没注意。
我还在用3.5…不忍直视
人工置顶
版本变化太快了,买的书又废了
顶一下。。。
koa2出了。。。最后一次更新
正在写研究blog,很有参考性,thanks
以下是关于“Nodejs express4.8之microblog学习笔记”的补充内容,基于你提供的信息:
第1章 一个简单的博客
问题与解决方案
-
设置DEBUG环境变量
- 问题:使用
set DEBUG=express:* node ./bin/www
设置DEBUG环境变量后,输出的信息太多。 - 解决方案:可以直接运行
npm start
。在bin/www
里的debug('Listening on ' + bind)
下面添加console.log('Listening on ' + bind)
来替代。
- 问题:使用
-
服务器位置
- 问题:建议不要把创建服务器的代码移到
app.js
中。 - 解决方案:保持创建服务器的代码在
bin/www
里,这样结构更清晰。
- 问题:建议不要把创建服务器的代码移到
-
开发工具
- 问题:建议替换
supervisor
为nodemon
。 - 解决方案:安装
nodemon
,然后用nodemon ./bin/www
启动项目。
- 问题:建议替换
-
中间件顺序
- 问题:
app.use(flash())
应该在app.use(session({}))
之前调用。 - 解决方案:确保
session
中间件在flash
之前。
- 问题:
-
session配置
- 问题:使用
express-session
时,控制台提示配置中最好设置resave
和saveUninitialized
。 - 解决方案:在
session
配置中明确设置这两个参数:app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true }));
- 问题:使用
-
注册用户成功后的回调
- 问题:注册用户成功后,回调函数中的
user[0]
可能不会返回正确的数据。 - 解决方案:使用
user.ops[0]
来获取正确的新用户对象。
- 问题:注册用户成功后,回调函数中的
第3章 增加文件上传功能
示例代码
var multer = require('multer');
// 配置multer存储策略
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './public/images');
},
filename: function (req, file, cb) {
cb(null, Date.now() + '-' + file.originalname);
}
});
var upload = multer({ storage: storage });
// 处理上传请求
app.post('/upload', checkLogin, upload.array('photos', 12), function (req, res) {
req.flash('success', '文件上传成功!');
res.redirect('/upload');
});
以上是对于“Nodejs express4.8之microblog学习笔记”的部分内容进行的总结和补充,希望对你有所帮助。