表达js无法获取/页面

时间:2015-10-08 20:16:12

标签: javascript node.js express

我在express.js上遇到路由错误。我正在使用jade来呈现我的页面浏览量。我已阅读所有文档并多次重构无济于事。

这是指向' / sell'的链接的简单内容。路由。

index.jade

include layout
html
  button.btn.btn-primary(type='submit', href='/sell') Add Item

单击此按钮时,浏览器会将以下内容作为404返回:

  

无法获取/出售

这里的问题是,如果要将上述href修改为其他页面,即' /' ,' / sign_in'等没有错误发生。这个问题似乎被隔离到' / sell'路由。

带有' / sell'的控制器路线如下:

server.js

var dotenv = require('dotenv');
dotenv.load();
var session = require('express-session')
var nodemailer = require('nodemailer');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var bcrypt = require('bcrypt');
var async = require('async');
var crypto = require('crypto');
var cookieParser = require('cookie-parser');
var flash = require('express-flash');
var express = require('express');
var app = express();
var mongoose = require('mongoose');
var root  = __dirname;
var path = require('path');
var User = require('./models/user');
var bodyParser = require('body-parser');
var errorHelper = require('mongoose-error-helper').errorHelper;
var validator = require('validator');
var Item = require("./models/item")

var username, email, password, owner, product_name, condition, details, price;

mongoose.connect(process.env.MONGODB_CONGO_DEV);

// Middleware
app.set('views', 'app/views');
app.set('view engine', 'jade');
app.set('port', process.env.PORT || 3000);
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true}));
app.use(cookieParser());
app.use(session( {
  secret: 'session secret key',
  resave: false,
  saveUninitialized: true
}));
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());

// Routing

app.get('/', function(req,res) {
    res.render('index', {
    title: 'Congo',
    message: 'Congo',
    user: req.user
  });
});

app.get('/sell', function(req,res) {
    res.render('item', {
    title: 'Congo - Sell',
    message: 'Sell',
    user: req.user
  });
});

app.get('/sign_in', function(req,res) {
    res.render('sign_in', {
    title: 'Congo',
    message: 'sign in motherfucker',
    user: req.user
  });
});

app.post('/sign_in', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) return next(err)
    if (!user) {
      req.flash('error', 'Incorrect login details');
      return res.redirect('/sign_in')
    };
    req.logIn(user, function(err) {
      if (err) return next(err);
      res.
      return res.redirect('/');
    });
  })(req, res, next);
});

app.get('/sign_up', function(req, res) {
  res.render('sign_up', {
    title: 'Congo',
    message: 'sign up',
    user: req.user
  });
});

app.post('/sign_up', function(req, res) {
  var user = new User({
      username: req.body.username,
      email: req.body.email,
      password: req.body.password
    });
  if (req.body.confirm != req.body.password) {
    req.flash('error', 'Password do not match')
    res.redirect('/sign_up')
  };
  else if (validator.isEmail(req.body.email) === false) {
    req.flash('error', 'Invalid email address')
    res.redirect('/sign_up')
  };
  else {
  user.save(function(err) {
    if (err) {
    req.flash('error', 'Email already in use')
    res.redirect('/sign_up')
    } else {
        req.logIn(user, function(err) {
        res.redirect('/');
      });
      }
    });
  };
});

app.get('/logout', function(req, res){
  req.logout();
  res.redirect('/');
});

app.get('/forgot', function(req, res) {
  res.render('forgot', {
    user: req.user,
    message: 'you wally'
  });
});

app.get('/profile', function(req, res) {
  res.render('profile', {
    user: req.user,
    message: 'User profile'
  });
});

app.post('/forgot', function(req, res, next) {
  async.waterfall([
    function(done) {
      crypto.randomBytes(20, function(err, buf) {
        var token = buf.toString('hex');
        done(err, token);
      });
    },
    function(token, done) {
      User.findOne({ email: req.body.email }, function(err, user) {
        if (!user) {
          req.flash('error', 'No account with that email address exists.');
          return res.redirect('/forgot');
        };

        user.resetPasswordToken = token;
        user.resetPasswordExpires = Date.now() + 3600000; // 1 hour

        user.save(function(err) {
          done(err, token, user);
        });
      });
    },
    function(token, user, done) {
      var smtpTransport = nodemailer.createTransport('SMTP', {
        service: 'Gmail',
        auth: {
          user: 'harryandrew.dix@gmail.com',
          pass: process.env.GMAIL_PASS
        };
      });
      var mailOptions = {
        to: user.email,
        from: 'passwordreset@demo.com',
        subject: 'Node.js Password Reset',
        text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
          'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
          'http://' + req.headers.host + '/reset/' + token + '\n\n' +
          'If you did not request this, please ignore this email and your password will remain unchanged.\n'
      };
      smtpTransport.sendMail(mailOptions, function(err) {
        req.flash('info', 'An e-mail has been sent to ' + user.email + ' with further instructions.');
        done(err, 'done');
      });
    };
  ], function(err) {
    if (err) return next(err);
    res.redirect('/forgot');
  });
});

app.get('/reset/:token', function(req,res) {
  User.findOne({resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now()}}, function(err,user) {
    if (!user) {
      req.flash('error', 'Password reset token invalid or expired.');
      return res.redirect('/forgot');
    }
    res.render('reset', {
      user: req.user,
      message: 'reset dem pass'
    });
  });
});

app.post('/reset/:token', function(req, res) {
  async.waterfall([
    function(done) {
      User.findOne({ resetPasswordToken: req.params.token, resetPasswordExpires: { $gt: Date.now() } }, function(err, user) {
        if (!user) {
          req.flash('error', 'Password reset token is invalid or has expired.');
          return res.redirect('back');
        };

        user.password = req.body.password;
        user.resetPasswordToken = undefined;
        user.resetPasswordExpires = undefined;

        user.save(function(err) {
          req.logIn(user, function(err) {
            done(err, user);
          });
        });
      });
    },
    function(user, done) {
      var smtpTransport = nodemailer.createTransport('SMTP', {
        service: 'Gmail',
        auth: {
          user: 'harryandrew.dix@gmail.com',
          pass: process.env.GMAIL_PASS
        };
      });
      var mailOptions = {
        to: user.email,
        from: 'passwordreset@demo.com',
        subject: 'Your password has been changed',
        text: 'Hello,\n\n' +
          'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\n'
      };
      smtpTransport.sendMail(mailOptions, function(err) {
        req.flash('success', 'Success! Your password has been changed.');
        done(err);
      });
    };
  ], function(err) {
    res.redirect('/');
  });
});

// app.post('/add_item', function(req, res) {
//   var item = new Item({
//       owner: req.user.id,
//       product_name: req.body.product_name,
//       condition: req.body.condition,
//       details: req.body.details,
//       price: req.body.price
//   });
//   item.save(function(err) {
//     if (err) {
//       req.flash('error', 'Something went wrong, make sure you are signed in.')
//         res.redirect('/add_item');
//     } else {
//       req.logIn(item, function(err) {
//         res.redirect('/user_profile');
//       });
//     };
//   });
// });

var server = app.listen(3000, function() {
  var host = server.address().address;
  var port = server.address().port;

  console.log('Example app listening at http://%s:%s',host,port);
});

item.jade

include layout
html
  block content
    form(method='POST')
        legend(style='font-family: Raleway; font-size: 30px;') Item Details
      .form-group
        label(for='product_name') Product Name
        input.form-control(type='text', name='product_name', placeholder='include product name, brand, condition, colour etc.', required autofocus)
      .form-group
        label(for='condition') Condition
        input.form-control(type='text', name='condition', placeholder='e.g. New, Used', required)
      .form-group
        label(for='image') Image
        input.form-control(type='file', name='image')
      .form-group
        label(for='details') Details
        textarea.form-control(name='details', cols='40', rows='5')
      .form-group
        label(for='price') Price
      .input-group
        .input-group-addon £
        input.form-control(type='text', placeholder='Amount', required)
        .input-group-addon .00
      br
      br
      button#btnSubmit.btn.btn-primary(type='submit') Post Item

2 个答案:

答案 0 :(得分:2)

我认为它以表格形式发布并试图联系app.post(' / sell')

改变它:

button.btn.btn-primary(type='submit', href='/sell') Add Item

为:

a.btn.btn-primary(href='/sell') Add Item

还会移除部分中间件并仅保留以下这些行:

app.set('views', 'app/views');
app.set('view engine', 'jade');
app.set('port', process.env.PORT || 3000);
app.use(logger('dev'));

然后在您的浏览器中导航到/卖出路线,检查它是否正常工作 如果是 - 我们删除了要检查的中间件之一的问题。

答案 1 :(得分:0)

您应该添加一个记录器中间件,并查看当您尝试转到该路由时服务器提供的错误。另一件事是重命名卖出路线,看看是否有效。这可能表明与您的另一条路线发生冲突,虽然目前尚不清楚查看您的代码的位置。