bugfix> javascript > 投稿

エクスプレスサーバーが定義されているapp.jsからサブスクライブフォームを呼び出すと、サブスクライブフォームが完全に機能するという問題がありますが、subscribe.jsをrouteフォルダーに移動すると、メールを送信できません。両方のファイルを接続しましたが、まだ機能しません。送信ボタンを押すと、「見つかりません」というエラーが表示されます(localhost:3000/send)

ここに私のapp.jsコードがあります

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var ejs = require('ejs');
var indexRouter = require('./routes/index');
var subscribeRouter = require('./routes/subscribe');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/subscribe', subscribeRouter);
module.exports = app;

と私のsubscribe.jsコード

var express = require('express');
var bodyParser = require('body-parser');
var nodemailer = require('nodemailer');
var router = express.Router();
/* GET Subscribe Page. */
  router.get('/', (req, res) => {
  res.render('subscribe');
});
// Body Parser Middleware
router.use(bodyParser.urlencoded({ extended: false }));
router.use(bodyParser.json());
router.post('/send', (req, res) => {
  const output = `
    <p>....</p>
    <h3>...</h3>
    <ul>  
        <li>E-naslov: ${req.body.email}</li>
    </ul>
  `;
// create reusable transporter object using the default SMTP transport
  let transporter = nodemailer.createTransport({
    host: '...'
    port: 465,
    secure: true, // true for 465, false for other ports
    auth: {
        user: 'example@example.com', // generated ethereal user
        pass: 'xxxxxxxx'  // generated ethereal password
    },
    tls:{
      rejectUnauthorized:false
    }
  });
// setup email data with unicode symbols
  let mailOptions = {
      from: '"blabla"<info@blabla.com>', // sender address
      to: 'example@gmail.com', // list of receivers
      subject: 'Novo naročilo na e-novice', // Subject line
      text: 'Hello world?', // plain text body
      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('subscribe', {msg:'Email has been sent'});
  });
});
module.exports = router;

私のsubscribe.ejsでは、フォームにはaction =/send、method = postがあります

回答 2 件
  • あなたのルートは実際には/ subscribe/sendだと思います

    インデックスでサブスクライブルーターを使用する場合、それを/ subscribeにマッピングし、そのルーターでは/ sendは相対的です。

  • 使用する

    app.use(subscribeRouter);
    
    

    の代わりに

    app.use('/send', subscribeRouter);
    
    

    更新

    ルート /send を使用するように上記のコードを変更しました  そして、subscribe.ejsがビューディレクトリに存在することを確認してください

あなたの答え