学习Nodejs:《Node.js开发指南》微博项目express2迁移至express4过程中填的坑
《Node.js开发指南》
项目地址
https://github.com/BYVoid/microblog
好不容易找到的基础版教程,但书中是基于express2的,而现在用的是express4了,本文主要介绍项目实现过程中遇到的各种问题及其解决方案;也是初学,所以有错的地方还望各位不吝指教,
项目基于express4,IDE用的是WebStorm,数据库是MongoDB,完全运行起来之后package.json中的dependencies如下:
"dependencies": {
"body-parser": "^1.18.3",
"connect": "^3.6.6",
"connect-mongo": "^2.0.1",
"connect-multiparty": "^2.1.1",
"connect-flash": "^0.1.1",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"ejs": "^2.5.9",
"express": "~4.16.0",
"express-ejs-layouts": "^2.5.0",
"express-session": "^1.15.6",
"express-partials": "^0.3.0",
"http-errors": "~1.6.2",
"mongoose": "^5.2.13",
"mongodb": "^2.2.33",
"morgan": "~1.9.0",
"moment": "^2.22.2",
"pug": "2.0.0-beta11",
"session": "^0.1.0"
app.js开头的引用部分是这样的:
var createError = require('http-errors');
var express = require('express');
var expressLayouts = require('express-ejs-layouts');
var path = require('path');
var cookieParser = require('cookie-parser');
var connect = require('connect');
var logger = require('morgan');
var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
var settings = require('./settings');
var partials = require('express-partials');
var flash = require('connect-flash');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
1、Q:书中使用npm install ejs express的命令,装完之后并没有ejs,当时还以为express的问题,卸载全局又安装,然后npm install,还是没有ejs,
A:后来就直接单独安装了,或者直接在package.json中直接添加ejs,由系统自动匹配安装的,
2、Q:在npm install之后去node app.js时,命令行执行完就结束了,并没有运行系统,
A:要在项目根目录下命令行 npm start,当然为了避免每次改动之后手动重启,所以可以使用监控命令,让系统检测到代码变动之后自动重启:supervisor .\bin\www
supervisor 也是全局安装的,
3、Q:现版本的express4默认的模板引擎是app.set('view engine', 'pug');但书中用的是ejs,
A:修改app.js,改为app.set('view engine', 'ejs');,当时按照网友说的改为HTML模板的,但是后遇到莫名问题,遂直接用书中使用的ejs,
4、Q:Error: Failed to lookup view "error" in views directory,
A:此时你有可能设置的是使用HTML模板引擎,改为使用ejs模板,添加error.ejs,内容如下:
<h1><%= message %></h1>
<h2><%= error.status %></h2>
<pre><%= error.stack %></pre>
5、Q:页面上显示为:function(req, res) { var err = req.flash('error');if (err.length)return err;else return null;};或者function(req, res) { var succ = req.flash
('success'); if (succ.length) return succ; else return null; };这是因为express4中动态视图助手的写法不一样,
A: app.js
res.locals.user = req.session.user;
res.locals.post = req.session.post;
var error = req.flash('error');
res.locals.error = error.length ? error : null;
var success = req.flash('success');
res.locals.success = success.length ? success : null;
next();
6、Q:partial is not defined,貌似partial不再随express4一同安装了,(一路上会遇到好多中间件分离的情况)
A:在package.json中添加express-partials,然后app.js添加:
var partials = require('express-partials');
app.use(partials());
7、Q:不能加载layout.ejs中样式,
A:在package.json中添加express-ejs-layouts,然后引入app.js,
8、Q:MongoDB安装到最后卡死,
A:安装引导过程最后一步中,不要选择,installing mongodb compass选项,可以考虑后续再自己安装,
9、Q:TypeError: Cannot read property 'Store' of undefined
A:修改app.js如下:
app.use(session({
resave: true,
saveUninitialized: true,
secret: settings.cookieSecret,
store: new MongoStore({
host: '127.0.0.1',
port: '27017',
db: 'microblog',
url: 'mongodb://localhost:27017/microblog'
})
}));
10、Q:TypeError: Cannot read property 'DEFAULT_PORT' of undefined
A:不要使用隐式方式默认端口,直接显式配置好,
11、Q:Most middleware (like session) is no longer bundled with Express
A:在package.json中添加express-session,然后引入app.js,
12、Q:title is not defined
A:修改layout.ejs中的title标签内容为:
<title><%= (typeof title != "undefined" ? title : "") %> - Microblog</title>
13、Q:TypeError: db.collection is not a function
A:在package.json中添加mongodb,然后引入db.js,
14、Q:命令行启动MongoDB时报,发生系统错误 5 拒绝访问。
A:需要管理员身份运行命令行工具,
15、Q:reference error post is not defined,有了新的写法,
A:<%- partial('posts', {posts:posts}) %>
16、Q:使用moment格式化日期时年份显示yyyy,不知原因,
A:使用moment自带的本地格式化函数就行了,this.time = new Date().toLocaleString();
提供几个参考链接:
1、<%- partial('posts') %> 在posts.ejs 中获取不到posts参数
2、《Node.js 入门系列》—— 一些简单的排错方法(一)
3、express 4.x 获取post提交的数据
4、express 4.x 获取post提交的数据
5、《nodejs开发指南》微博实例express4.x版
6、《nodejs开发指南》microblog实例express4.15.x版
7、Express+MongoDB+Robomongo环境配置
8、node+express+mongodb初体验
9、Nodejs Express 连接Mongodb
10、迁移到 Express 4
另外,可以使用console.log(req.body);在命令行输出值来调试程序,
最后,有问题欢迎发邮件至sdsfhtw@163.com一起讨论学习,O(∩_∩)O哈哈~
学习Nodejs:《Node.js开发指南》微博项目express2迁移至express4过程中填的坑的更多相关文章
- Node.js开发指南中的例子(mysql版)
工作原因需要用到nodejs,于是找到了<node.js开发指南>这本书来看看,作者BYVoid 为清华大学计算机系的高材生,年纪竟比我还小一两岁,中华地广物博真是人才辈出,佩服. 言归正 ...
- 《node.js开发指南》partial is not defined的解决方案
由于ejs的升级,<node.js开发指南>中使用的 partial 函数已经摒弃,使用foreach,include代替 原来的代码是: <%- partial('listitem ...
- Node.js学习笔记——Node.js开发Web后台服务
一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...
- Koa与Node.js开发实战(3)——Nunjucks模板在Koa中的应用(视频演示)
技术架构: 在Koa中应用Nunjucks,需要先把Nunjucks集成为符合Koa规格的中间件(Middleware),从本质上来讲,集成后的中间件的作用是给上下文对象绑定一个render(vi ...
- NODE.JS开发指南学习笔记
1.Node.js是什么 Node.js是一个让JS运行在服务器端的开发平台,它可以作为服务器向用户提供服务.Node.js中的javascript只是Core javascript,或者说是ECMA ...
- NODE.JS开发指南学习笔记2
1.核心模块 核心模块是Node.js的心脏,由一些精简高效的库组成,为其提供了基本的API.2.全局对象 global.所有的的全局变量都是其属性.其根本的作用是作为全局变量的宿主.3.全局变量 1 ...
- Node.js 开发指南
1.Node.js 简介 Node.js 其实就是借助谷歌的 V8 引擎,将桌面端的 js 带到了服务器端,它的出现我将其归结为两点: V8 引擎的出色: js 异步 io 与事件驱动给服务器带来极高 ...
- 《node.js开发指南》读书笔记(一)
在开发时如果修改了js内容,不能通过刷新浏览器直接看到效果,必须通过重启nodejs程序才能看到,这样显然不利于开发调试,supervisor可以实现这个功能,监视对代码的改动,并自动重启nodejs ...
- Node.js 开发指南笔记
第一章:node简介 介绍了node是什么:node.js是一个让javascript运行在服务器端的开发平台, node能做些什么:[书上的] 具有复杂逻辑的网站 基于社交网络的大规模Web应用 W ...
随机推荐
- laravel 更新
public function update(Request $request, ResponseFactoryContract $response) { $user = $request->u ...
- 为什么访问json接口出现文件下载
在IE9,10,11下,当服务器端返回数据格式为json,且明确设置Content-Type为”application/json;charset=utf-8“时,会提示文件下载.如图所示: 解决办法是 ...
- 一脸懵逼学习Nginx及其安装,Tomcat的安装
1:Nginx的相关概念知识: 1.1:反向代理: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到 ...
- jquery实时监听输入框值变化
在做web开发时候很多时候都需要即时监听输入框值的变化,以便作出即时动作去引导浏览者增强网站的用户体验感.而采用onchange时间又往往是在输入框失去焦点(onblur)时候触发,有时候并不能满足条 ...
- 【BZOJ4155】[Ipsc2015]Humble Captains
题解: 第一问裸的最小割 第二问考虑贪心 我们把边权平均分配给两个点 然后就变成了给n个数分两组差最小 np-hard问题 暴力背包,操作存在区间左移,右移,or bieset优化
- BZOJ4675
题解: 考虑这么一件事情,n个人买彩票,在不断抽走卡片的时候,他们的中奖概率是不变的 所以在这道题中,由于每个人的操作次数是确定的,所以选每k个点的概率是相同的(因为如果我们逐一考虑每一次操作这个问题 ...
- ipython启动 自动导入模块 自动%logstart
1. 参考 启动ipython或python解释器自动导入组件(例如:numpy) http://ipython.org/ipython-doc/stable/config/intro.html#se ...
- MediatR
1.MediatR是什么? 微软官方eshopOnContainer开源项目中使用到了该工具, mediatR 是一种中介工具,解耦了消息处理器和消息之间耦合的类库,支持跨平台 .net Standa ...
- jQuery选择器总结 jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法
新年第一编文章 jQuery 的选择器可谓之强大无比,这里简单地总结一下常用的元素查找方法 $("#myELement") 选择id值等于myElement的元素,id值 ...
- mongodb中投票节点作用
投票节点 并不含有 复制集中的数据集副本,且也 无法 升职为主节点.投票节点的存在是为了使复制集中的节点数量为奇数,这样保证在进行投票的时候不会出现票数相同的情况.如果添加了一个节点后,总节点数为偶数 ...