安装mongodb

 
https://www.mongodb.com/try/download/community

ubantu20.04
wget https://repo.mongodb.org/apt/ubuntu/dists/focal/mongodb-org/7.0/multiverse/binary-amd64/mongodb-org-server_7.0.4_amd64.deb


centos7 
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/7.0/x86_64/RPMS/mongodb-org-server-7.0.4-1.el7.x86_64.rpm

rpm -ivh mongodb-org-server-7.0.4-1.el7.x86_64.rpm

# which mongod
/usr/bin/mongod

mkdir -p /opt/app/mongodb/{data,log}

mongod --port=27017 --dbpath=/opt/app/mongodb/data --logpath=/opt/app/mongodb/log/mongodb.log --bind_ip=0.0.0.0 --fork


# netstat -tunlp |grep mongo
tcp        0      0 0.0.0.0:27017           0.0.0.0:*               LISTEN      201/mongod          


connecting to: mongodb://127.0.0.1:27017

客户端 compass
https://www.mongodb.com/products/tools/compass
https://www.mongodb.com/try/download/shell
https://downloads.mongodb.com/compass/mongosh-2.1.1-x64.msi

命令行版
wget https://downloads.mongodb.com/compass/mongodb-mongosh-2.1.1.x86_64.rpm
yum localinstall mongodb-mongosh-2.1.1.x86_64.rpm 

[root@nd ~]# 
[root@nd ~]# mongosh
Current Mongosh Log ID:	6572d8e7f2aa0e8293805e94
Connecting to:		mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.1.1
Using MongoDB:		7.0.4
Using Mongosh:		2.1.1

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

------
   The server generated these startup warnings when booting
   2023-12-08T03:01:12.236-05:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
   2023-12-08T03:01:12.236-05:00: You are running this process as the root user, which is not recommended
   2023-12-08T03:01:12.236-05:00: vm.max_map_count is too low
------

Deprecation warnings:
  - Using mongosh on the current operating system is deprecated, and support may be removed in a future release.
See https://www.mongodb.com/docs/mongodb-shell/install/#supported-operating-systems for documentation on supported platforms.
test> db
test
test> show dbs
admin              40.00 KiB
bnew-development    8.00 KiB
config            108.00 KiB
local              40.00 KiB

创建数据库 
test> use bnew-development
switched to db bnew-development

bnew-development> db
bnew-development

创建项目

 
yarn global add yo@4.3.1
yarn global add generator-express@2.17.2 
yarn global add npm-check 

  
export PATH=/wks/nodejs/bnew/node_modules/.bin:$PATH


[xt@nd nodejs]$ yo express 
? Would you like to create a new directory for your project? Yes
? Enter directory name bnew
? Select a version to install: MVC
? Select a view engine to use: Pug
? Select a css preprocessor to use: Sass
? Select a database to use: MongoDB
? Select a build tool to use: Gulp

package.json

 
{
    "name": "bnew",
    "version": "0.0.1",
    "private": true,
    "main": "app.js",
    "scripts": {
        "start": "node app.js",
        "test": "NODE_ENV=test mocha --recursive test",
        "test:coverage": "nyc npm test",
        "test:unit": "mocha --recursive test/middleware test/models test/routes",
        "test:integration": "mocha --recursive test/integration"
    },
    "dependencies": {
        "@fortawesome/fontawesome-free": "^5.15.3",
        "async": "^3.2.4",
        "axios": "^0.27.2",
        "body-parser": "^1.13.3",
        "bootstrap": "^5.0.2",
        "compression": "^1.7.4",
        "connect-flash": "^0.1.1",
        "cookie-parser": "^1.3.3",
        "cropper": "^4.1.0",
        "cropperjs": "^1.5.12",
        "del": "^6.0.0",
        "express": "^4.13.3",
        "express-session": "^1.17.3",
        "express-validator": "^6.14.2",
        "generator-express": "^2.17.2",
        "glob": "^7.2.0",
        "jquery": "^3.6.0",
        "jquery-cropper": "^1.0.1",
        "jsdom": "^19.0.0",
        "method-override": "^3.0.0",
        "mongoose": "^6.8.0",
        "morgan": "^1.6.1",
        "natives": "^1.1.6",
        "passport": "^0.6.0",
        "passport-local": "^1.0.0",
        "passport-local-mongoose": "^7.1.2",
        "path": "^0.12.7",
        "pug": "^3.0.2",
        "serve-favicon": "^2.3.0",
        "svg-captcha": "^1.4.0",
        "ueditor": "^1.2.3",
        "webpack": "^5.72.1",
        "webpack-stream": "^7.0.0"
    },
    "devDependencies": {
        "@babel/core": "^7.14.6",
        "@babel/plugin-transform-runtime": "^7.14.5",
        "@babel/preset-env": "^7.14.7",
        "@babel/register": "^7.14.5",
        "@babel/runtime": "^7.14.6",
        "babel-core": "^7.0.0-bridge.0",
        "babel-loader": "^8.2.5",
        "babel-polyfill": "^6.26.0",
        "chai": "^4.3.6",
        "debug": "^4.3.3",
        "gulp": "^4.0.2",
        "gulp-babel": "^8.0.0",
        "gulp-clean-css": "^4.3.0",
        "gulp-concat": "^2.6.1",
        "gulp-livereload": "^4.0.2",
        "gulp-nodemon": "^2.0.2",
        "gulp-plumber": "^1.0.0",
        "gulp-rename": "^2.0.0",
        "gulp-sass": "^5.1.0",
        "gulp-uglify": "^3.0.2",
        "gulp-uglify-es": "^2.0.0",
        "install": "^0.13.0",
        "mocha": "^9.2.1",
        "node-sass": "^6.0.1",
        "npm-check": "^6.0.1",
        "nyc": "^15.1.0",
        "regenerator-runtime": "^0.13.7",
        "sass": "^1.35.2",
        "supertest": "^6.2.2",
        "vinyl-named": "^1.1.0",
        "yo": "^4.3.1"
    }
}
      

安装

 
yarn install 

配置babel与gulp

 
.babelrc文件 
{
    "presets": [  "@babel/preset-env" ],
    "plugins": [  "@babel/plugin-transform-runtime" ]
}

删除原来的gulpfile.js文件,创建gulpfile.babel.js
const gulp = require('gulp');
// var babel = require("gulp-babel");

const compiler = require('webpack');
const webpack = require('webpack-stream');

const nodemon = require('gulp-nodemon');
const plumber = require('gulp-plumber');
const named = require('vinyl-named');             // 名字缩写
const uglify = require('gulp-uglify-es').default; //支持ES6的一些写法
const livereload = require('gulp-livereload');
const sass = require('gulp-sass')(require('sass'));
const glob = require('glob');
const path = require('path')

require('babel-polyfill');


let cssTasks = new Map();

//读取src/css/admin/*.scss = > public/css/admin
let cssFiles = glob.sync(__dirname + '/src/css/+(admin|blog|include)/*.scss');
// console.log(cssFiles);

cssFiles.forEach(cssFile => {
  //给每个文件添加一个task,当某一个文件修改时,不至于编译所有文件
  let dest = path.dirname(cssFile.replace('src', 'public'));

  cssTasks.set(cssFile, function(cb){

    gulp.src(cssFile)
      .pipe(plumber())
      .pipe(sass({outputStyle: 'compressed'}))
      .pipe(gulp.dest(dest))
      .pipe(livereload());
    cb();
  });
});


function css(cb){
  gulp.series(...cssTasks.values());
  cb();
}

//-------------------js-------------------------------------------------
let jsTasks = new Map();
let jsFiles = glob.sync(__dirname + '/src/js/+(admin|blog|jihe)/*.js');
jsFiles.forEach(jsFile => {
  //给每个文件添加一个task,当某一个文件修改时,不至于编译所有文件
  let dest = path.dirname(jsFile.replace('src', 'public'));
  jsTasks.set(jsFile, function(cb){
    // console.log(jsFile);

    gulp.src(jsFile)
      .pipe(plumber())
      .pipe(named())   //名字缩写
      .pipe(webpack({
        mode: 'development',
        watch: true,
        module: {
          rules: [{
            test: /\.js$/,
            exclude: path.resolve(__dirname,'node_modules/'),
            use: {
              loader: 'babel-loader',
              options: {
                  presets: ["@babel/preset-env"],
                  compact: false,
                  plugins: ["@babel/plugin-transform-runtime"]
              }
            }
          }]
        }
      },compiler))
      .pipe(uglify())  //加强ES6语法支持
      .pipe(gulp.dest(dest))
      .pipe(livereload());
    cb();
  });
});

function js(cb){
  gulp.series(...jsTasks.values());
  cb();
}

//-------------------img-------------------------------------------------
function img(cb){
  gulp.src('./src/img/*.*')
    .pipe(gulp.dest('./public/img/'))
    .pipe(livereload());
  cb();
}



function watch(cb){
  // gulp.watch('./src/css/*.scss', gulp.parallel(css));
  for(let [key, value] of cssTasks.entries()){
    // console.log(value);
    gulp.watch(key, gulp.parallel(value));
  }
  // gulp.watch('./src/js/**/*.js', gulp.parallel(js));
  for(let [key, value] of jsTasks.entries()){
    // console.log(value);
    gulp.watch(key, gulp.parallel(value));
  }
  gulp.watch('./src/img/*.*', gulp.parallel(img));
  cb();
}

function develop(cb){
  livereload.listen();
  nodemon({
    script: 'app.js',
    ext: 'js coffee pug',
    stdout: false
  }).on('readable', function () {
    this.stdout.on('data', (chunk) => {
      if (/^Express server listening on port/.test(chunk)) {
        livereload.changed(__dirname);
      }
    });
    this.stdout.pipe(process.stdout);
    this.stderr.pipe(process.stderr);
  });
  cb();
}

exports.default = gulp.parallel(img, css, js, watch, develop);

创建src目录

 
rsync -rltDv /opt/tpf/nodejs/myblog/blog1/src ./

src的目录结构与gulpfile.babel.js中的目录结构一致就可以了

启动gulp

 
[xt@nd bnew]$ gulp
...
...
...
(node:1673) [MONGOOSE] DeprecationWarning: Mongoose: the `strictQuery` option will be switched back to `false` by default in Mongoose 7. Use `mongoose.set('strictQuery', false);` if you want to prepare for this change. Or use `mongoose.set('strictQuery', true);` to suppress this warning.
(Use `node --trace-deprecation ...` to show where the warning was created)
[03:25:52] /wks/nodejs/bnew reloaded.
Express server listening on port 3000

至此成功启动项目 

访问:
http://localhost:3000/

看到页面上显示两行:

Generator-Express MVC

Welcome to Generator-Express MVC
    

config/config.js 配置数据库地址

 
db: 'mongodb://localhost/bnew-development'

修改为自己的IP:PORT 

db: 'mongodb://127.0.0.1:27017/bnew-development'

创建启动

 
su - root 

mongod --port=27017 --dbpath=/opt/app/mongodb/data --logpath=/opt/app/mongodb/log/mongodb.log --bind_ip=0.0.0.0 --fork


 
su - xt 

cd /wks/nodejs/bnew
gulp 


创建结构及流转

 
app.js是总入口,引入所有的js文件
const models = glob.sync(config.root + '/app/models/*.js');
models.forEach(function (model) {
  require(model);
});


接下来是要让js与对应的页面views关联起来,这由express完成,app.js引入config/express.js 
const app = express();
module.exports = require('./config/express')(app, config);

将app,config作用为参数传给了express 
express引入所有页面
app.set('views', config.root + '/app/views');
app.set('view engine', 'pug');

引入所有的路由,其中路由指定了访问的配对关系 
var controllers = glob.sync(config.root + '/app/controllers/*.js');
  controllers.forEach((controller) => {
    require(controller)(app);
  });

//根路径定义
  module.exports = (app) => {
    app.use('/', router);
  };

//若要访问根目录/,就转到views目录下的index为前缀的页面
  router.get('/', (req, res, next) => {
    Article.find((err, articles) => {
      if (err) return next(err);
      res.render('index', {
        title: 'Generator-Express MVC',
        articles: articles
      });
    });
  });
  
最后编译为静态文件后,所有的js都放一起了

参考