• 学习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 .inwww
    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

    11、使用 morgan 中间件记录日志

    另外,可以使用console.log(req.body);在命令行输出值来调试程序,

    最后,有问题欢迎发邮件至sdsfhtw@163.com一起讨论学习,O(∩_∩)O哈哈~

  • 相关阅读:
    JAVA面试基础
    扔硬币问题
    随机数生成随机数
    囚犯猜帽子问题
    十道智力题(三)
    十道智力题(二)
    十道智力题(一)
    lintcode:排颜色 II
    机器学习中的几个常见概念(持续更新中......)
    如何打印一棵树(Java)
  • 原文地址:https://www.cnblogs.com/1394htw/p/9613605.html
Copyright © 2020-2023  润新知