【问题标题】:Separating routes in Express在 Express 中分离路线
【发布时间】:2018-01-10 03:39:33
【问题描述】:

编辑#2

知道了,更新代码

app.js

const express = require('express');
const bodyParser = require('body-parser');
const hbs = require('hbs');
const fs = require('fs');

var app = express();

// Server port
const port = process.env.PORT || 3000;
// Server starting message
app.listen(port, () => {
  console.log(`Server is up on port ${port}`);
});

// Views directory established and handbars engine
hbs.registerPartials(__dirname + '/views/layouts')
app.set('view engine', 'hbs');

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

// body-parser middleware
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

// server.log setup middleware
app.use((req, res, next) => {
  var now = new Date().toString();
  var log = `${now}: ${req.method} ${req.url}`

  console.log(log);

  fs.appendFile('server.log', log + '\n', (err) => {
    if (err) {
      console.log('Unable to append to server.log');
    }
  });
  next();
});

// Routes
const routes = require('./routes/routes');
app.use("/", routes);

// Get year for footer
hbs.registerHelper('getCurrentYear', () => {
  return new Date().getFullYear()
});

感谢大家的帮助!

编辑#1

我已将app.use("/", routes)" 添加到我的app.js 但现在当我测试我的联系表和邮件时,我得到以下信息:

TypeError: Cannot read property 'name' of undefined
    at router.post (/Users/benbagley/Code/poetry-out-loud/routes/routes.js:29:27)
    at Layer.handle [as handle_request] (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/router/layer.js:95:5)
    at next (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/router/layer.js:95:5)
    at /Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/router/index.js:281:22
    at Function.process_params (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/router/index.js:335:12)
    at next (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/router/index.js:275:10)
    at Function.handle (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/router/index.js:174:3)
    at router (/Users/benbagley/Code/poetry-out-loud/node_modules/express/lib/router/index.js:47:12)

--

原始问题

我目前正在开发一个 node.js 应用程序,我正在尝试将我的应用程序和路由分离到单独的文件中。

这是我目前所拥有的

app.js

const express = require('express');
const bodyParser = require('body-parser');
const nodemailer = require('nodemailer');
const hbs = require('hbs');
const fs = require('fs');

const port = process.env.PORT || 3000;
var app = express();

hbs.registerPartials(__dirname + '/views/layouts')
app.set('view engine', 'hbs');

// body-parser middleware
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

const routes = require('./routes/routes');

app.use((req, res, next) => {
  var now = new Date().toString();
  var log = `${now}: ${req.method} ${req.url}`

  console.log(log);

  fs.appendFile('server.log', log + '\n', (err) => {
    if (err) {
      console.log('Unable to append to server.log');
    }
  });
  next();
});

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

hbs.registerHelper('getCurrentYear', () => {
  return new Date().getFullYear()
});

app.listen(port, () => {
  console.log(`Server is up on port ${port}`);
});

routes.js

const express = require('express');
const router = express.Router();

// Routes
router.get('/', (req, res) => {
  res.render('index.hbs', {
    pageTitle: 'homepage'
  });
});

router.get('/registration', (req, res) => {
  res.render('registration.hbs', {
    pageTitle: 'Registration'
  });
});

router.get('/login', (req, res) => {
  res.render('login.hbs', {
    pageTitle: 'Login'
  });
});

router.post('/send', (req, res) => {
  const output = `
    <p>You have a new contact request</p>
    <h3>Contact Details</h3>
    <br>
    <ul>
    <li>Name: ${ req.body.name }</li>
    <li>Name: ${ req.body.email }</li>
    </ul>

    <h3>Message:</h3>
    <p>${ req.body.message }</p>
  `;

  nodemailer.createTestAccount((err, account) => {
    // create reusable transporter object using the default SMTP transport
    let transporter = nodemailer.createTransport({
      host: "smtp.mailtrap.io",
      port: 2525,
      auth: {
        user: "xxxxxxx",
        pass: "xxxxxxx"
      }
    });
    // setup email data with unicode symbols
    let mailOptions = {
      from: `"${req.body.name}" <${req.body.email}>`, // sender address
      to: 'xxxxxxxxx', // list of receivers
      subject: 'New contact message', // Subject line
      html: output // html body
    };
    // send mail with defined transport object
    transporter.sendMail(mailOptions, (error, info) => {
      if (error) {
        return console.log(error);
      }

      console.log('Message sent: %s', info.messageId);
      console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));

      res.render('index', {
        pageTitle: 'Thank you'
      });
    });
  });
});

module.exports = router;

我正在接收的当前终端输出是

Server is up on port 3000
Tue Jan 09 2018 15:58:40 GMT+0000 (GMT): GET /
[nodemon] restarting due to changes...
[nodemon] starting `node app.js hbs, css`
Server is up on port 3000

在我正在浏览的浏览器中

这是文件结构的截图

如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 您需要致电app.use("/", routes)"in app.js
  • @KhauriMcClain 我更新了这个问题,对联系表格和邮件进行了编辑。

标签: javascript node.js express backend


【解决方案1】:

我还是新手,但我在基本 URL 上使用以下内容:
app.get('/', (req, res) => { res.json('ready for your queries'); });
在哪里 app = express()
这是一个简单的代码,让我知道服务器正在运行,而无需对其他服务进行任何操作。

【讨论】:

    【解决方案2】:

    您应该寻求经过测试的解决方案。我喜欢使用快速生成器。它为您创建了一个很好的结构:

    -bin
     www
    -config
    -public
     -javascripts
     -stylesheets
     -images
    -routes
     index.js
     something.js
    -views
     index.ejs
     something.ejs
    app.js
    

    bin/www 保存您的服务器设置,app.js 是您加载配置、路由和模型的位置(如果您使用数据库)。 http://expressjs.com/en/starter/generator.html

    将代码移至此结构应该不会有太大问题。如果您有任何疑问,请随时询问。

    【讨论】:

      【解决方案3】:
      Your code will be      
      
      app.js 
      
      const express = require('express');
      const bodyParser = require('body-parser');
      const nodemailer = require('nodemailer');
      const hbs = require('hbs');
      const fs = require('fs');
      
      var app = express();
      
      const port = process.env.PORT || 3000;
      const routes = require('./routes/routes');
      
      
      hbs.registerPartials(__dirname + '/views/layouts')
      app.set('view engine', 'hbs');
      
      // body-parser middleware
      app.use(bodyParser.urlencoded({ extended: false }))
      app.use(bodyParser.json())
      
      router(app);
      
      app.use((req, res, next) => {
          var now = new Date().toString();
      var log = `${now}: ${req.method} ${req.url}`
      
      console.log(log);
      
      fs.appendFile('server.log', log + '\n', (err) => {
          if (err) {
              console.log('Unable to append to server.log');
          }
      });
      next();
      });
      
      app.use(express.static(__dirname + '/public'));
      
      hbs.registerHelper('getCurrentYear', () => {
          return new Date().getFullYear()
      });
      
      app.listen(port, () => {
          console.log(`Server is up on port ${port}`);
      });
      
      
      routes.js
      
      
      module.exports = function (app) {
      
         app.get('/', (req, res) => {   res.render('index.hbs', {   pageTitle: 'homepage'  }); });
      
          router.get('/login', (req, res) => {  res.render('login.hbs', { pageTitle: 'Login'  }); });
      
      ..... Remaining function
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-18
        • 2015-06-30
        • 2020-07-23
        • 2021-09-29
        • 2014-07-18
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        相关资源
        最近更新 更多