路由在使用 Jade 生成静态 html 文件的快速应用程序中不起作用

Routes not working in an express app using Jade to generate static html files

您好,我正在尝试创建我的第一个节点应用程序/环境。

应用结构

MyApp/
-node_modules/
-public/
--images/
--javascript/
--scss/
-routes/
-source/
--images/
--javascript/
--scss/
-views/
-gulp.js
-app.js
-package.json

我在 运行 我的应用程序中使用以下内容:

使用节点 gulp 作为任务管理器(sass、jshint、jade 到 html) 玉为模板 快递(服务器和路由)

也许值得一提的是,我正在使用 gulp 从我的 jade 模板生成 html 文件。

我的问题是路由,我无法使路由工作,我 运行 gulp 处理我的所有任务并启动节点 app.js 启动服务器。

这是我的 gulp.js

代码
/* file: gulpfile.js */

var gulp = require('gulp'),
    gutil = require('gulp-util'),
    express = require('express'),
    jshint = require('gulp-jshint'),
    sass   = require('gulp-sass'),
    plumber = require('gulp-plumber'),
    sourcemaps = require('gulp-sourcemaps'),
    autoprefixer = require('gulp-autoprefixer'),
    minifycss = require('gulp-minify-css'),
    rename = require('gulp-rename'),
    concat = require('gulp-concat'),
    uglify = require('gulp-uglify'),
    imagemin = require('gulp-imagemin'),
    cache = require('gulp-cache'),
    jade = require('gulp-jade');


// Server and live reload ==========================

gulp.task('express', function() {
  var express = require('express');
  var app = express();
  app.use(require('connect-livereload')({port: 35729}));
  app.use(express.static(__dirname));
  app.listen(4000, '0.0.0.0');
});

var tinylr;
gulp.task('livereload', function() {
  tinylr = require('tiny-lr')();
    tinylr.listen(35729);
});

function notifyLiveReload(event) {
  var fileName = require('path').relative(__dirname, event.path);

  tinylr.changed({
    body: {
      files: [fileName]
    }
  });
}


// Task templates jade =============================

gulp.task('html', function() {
    return gulp.src('views/*.jade')
        .pipe(jade({
             pretty: true
        })) // pip to jade plugin
        .pipe(gulp.dest('public/')); // tell gulp our output folder
});


// SASS and Minify ==================================

var onError = function (err) {  
  gutil.beep();
  console.log(err);
};


gulp.task('styles', function() {
  return gulp.src('source/scss/**/*.scss')
    .pipe(plumber({
      errorHandler: onError
    }))
    .pipe(sourcemaps.init())  // Process the original sources
    .pipe(sass().on('error', sass.logError))
    .pipe(sourcemaps.write()) // Add the map to modified source.
    .pipe(autoprefixer(
        {
            browsers: [
                '> 1%',
                'last 2 versions',
                'firefox >= 4',
                'safari 7',
                'safari 8',
                'IE 8',
                'IE 9',
                'IE 10',
                'IE 11'
            ],
            cascade: false
        }
    ))
    .pipe(gulp.dest('./public/styles/'))
    .pipe(rename({suffix: '.min'}))
    .pipe(minifycss())
    .pipe(gulp.dest('public/styles/'));
});



// Javascript concat and uglify ============================= 

gulp.task('build-js', function() {
  return gulp.src('source/javascript/**/*.js')
    .pipe(jshint())
    .pipe(jshint.reporter('jshint-stylish'))
    .pipe(sourcemaps.init())
      .pipe(concat('main.js'))
      .pipe(rename({suffix: '.min'}))
      .pipe(uglify())
    .pipe(sourcemaps.write())
    .pipe(gulp.dest('public/javascript'));
});

//  Images Taks optimization ================================

gulp.task('images', function(){
  return gulp.src('source/images/**/*.+(png|jpg|gif|svg)')
  .pipe(cache(imagemin({
      interlaced: true
    })))
  .pipe(gulp.dest('public/images'))
});


// Watch task ==================================================

gulp.task('watch', function() {
  gulp.watch('source/scss/*.scss', ['styles']);
  gulp.watch('source/javascript/**/*.js', ['build-js']);
  gulp.watch('./views/**/*.jade', ['html']);
  gulp.watch('./public/*.html', notifyLiveReload);
  gulp.watch('./views/**/*.jade',  notifyLiveReload);
  gulp.watch('./public/styles/*.css', notifyLiveReload);
});

gulp.task('default', ['html', 'styles', 'express', 'build-js', 'livereload', 'watch'], function() {

});

这是我的 app.js

// BASE SETUP ===============================================

'use strict';

var express = require('express');
var app = express();
// var routes = require('./routes/index');

// CONFIGURATION ============================================

app.set('views', __dirname + '/views');
//app.engine('jade', require('jade').__express)
app.set('view engine', 'jade');

app.use(express.static(__dirname + '/public'))

// app.use('/', routes);


// CREATE SERVER ============================================

app.listen(3000, function(){
    console.log('App started in port 3000');
});

module.exports = app;

如果您打算在 express 中使用 jade 作为视图引擎,您可以取消对 jade 文件的 gulp 编译。这是不必要的步骤。

app.set('views', __dirname + '/views');
app.set('view engine', 'jade');

这些行告诉 express 在路由器内调用 render() 时使用 jade。当你设置你的路由时,无论它们是 root app.get('/', function(req, res){}) 还是其他 - 只需调用 res.render('viewname') 让 express 从那里接管。它将在请求触发时调用 jade 编译器并 return html 输出。这允许您插入一个 object 作为渲染的第二个参数并传入动态数据。

此处为突破示例:

假设你设置了 app.set('views', __dirname + '/views'); 这告诉 express 在你调用 render('home') 时查看 /views 目录中的 jade 文件。您不需要指定 '/views/home.jade' 或类似的内容。如果您在 /views 中有嵌套文件夹,它将成为您的根目录,因此调用 render('/subfolder/nested') 将起作用。

/views
- home.jade
- secondary.jade
  /subfolder
  - nested.jade

上述视图的示例路线

app.get('/', function(req, res){
  //do some sort of preprocessing here if you want
  res.render('home');
})

app.post('/secondary', function(req, res){
  //do some sort of preprocessing here if you want
  res.render('secondary', {somedata: 'this is data'});
})

注意 render 的第二个参数是 object。在 secondary.jade 中,您现在可以访问一些数据作为变量。例如,您可以将标题设置为 somedata

doctype html
html
  head
    title=somedata
  body

标题会变成'this is data'

希望这对您有所帮助。