【问题标题】:NodeJS Post Request "Cannot POST /upload"NodeJS发布请求“无法发布/上传”
【发布时间】:2018-08-19 07:39:31
【问题描述】:

我正在尝试在我用 NodeJS 创建的 Web 应用程序上创建一个简单的上传功能。我有一条到 /admin 的路由,我用它来呈现表单页面。以下是 /admin.handlebars 页面的 HTML。

<body>
  <div class = "container">
    <div class = "row">
      <div class = "col-md-6 m-auto">
        <h1 class = "text-center display-4 my-4">Upload Tutorial Template</h1>
        <form action = "./upload" method ="POST" enctype="multipart/form-data">
          <div class="custom-file mb-3">
            <input type="file" name="file" id="file" class="custom-file-input">
            <label for = "file" class="custom-file-label">Choose Video</label>
            </div
        </form>
        <input type="submit" value="Submit" class="btn btn-primary btn-block"
      </div>
    </div>
  </div>`

处理 post 请求的 admin.js 文件部分显示在下面,目前我正在尝试在屏幕上呈现文件名,但是当我单击 sumbmit 按钮时,屏幕显示“无法 POST /upload”。

router.get('/', function (req, res) {
  console.log("Rendered Upload page")
  res.render('admin');
});

//route of post to upoad, Uploads file to db
router.post('/upload', upload.single('file'), function (req, res) {
  console.log("Post made")
  res.response({file: req.file});
});

编辑主 app.js 文件。

 var express = require('express');
 var path = require('path');
 var cookieParser = require('cookie-parser');
 var bodyParser = require('body-parser');
 var exphbs = require('express-handlebars');
 var expressValidator = require('express-validator');
 var flash = require('connect-flash');
 var session = require('express-session');
 var passport = require('passport');
 var LocalStrategy = require('passport-local').Strategy;
 var mongo = require('mongodb');
 var mongoose = require('mongoose');


 //Mongoose Part
 mongoose.connect('mongodb://localhost/loginapp');
 //mongodb
 var db = mongoose.connection;

var routes = require('./routes/index');
var users = require('./routes/users');
var admin = require('./routes/admin');

//start app
// using express for first time to initialize
var app = express();

//Viewing engine start here\
// views folder to handle views
app.set('views', path.join(__dirname, 'views'));
// set hanglebards ass the engine, default layout called layout.handlebars
app.engine('handlebars', exphbs({defaultLayout:'layout'}));
//set to handlebards
app.set('view engine', 'handlebars');
//images
// app.set('view engine', 'ejs')

app.use(express.static('views/images'));

//Middleware config
//Video Tutorial
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false}));
app.use(cookieParser());

// Public Folder to hold images, jquery, stylesheets
app.use(express.static(path.join(__dirname, 'public')));

//use of Express session
app.use(session({
  secret: 'secret',
  saveUnitialized: true,
  resave: true
}));

//PASSPORT INNIT FOR VALIDATIOn
app.use(passport.initialize());
app.use(passport.session());

//Express Validator from https://devhub.io/repos/ctavan-express-validator
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));

//connect the flash
app.use(flash());

//set GLOBAL variables for flash messages
app.use(function (req, res, next) {
  //response local sucess message = require flash 'sucess msg'
  res.locals.sucess_msg = req.flash('sucess_msg');
  res.locals.error_msg = req.flash('error_msg');
  //passport error messages
  res.locals.error = req.flash('error');
  //for the nav bar when logged inspect
  res.locals.user = req.user || null;
  next();
});


app.use('/', routes);
// ADMIN BELOW
app.use('/admin', admin);
//UPLAOD BIT
app.use('/users', users);

//Setting the port for the page/app
app.set('port', (process.env.PORT || 3000));

app.listen(app.get('port'), function(){
  console.log('Server Started on Port '+app.get('port'));
})

【问题讨论】:

  • 您是否尝试在 Postman 中使用 /admin/upload 拨打电话?
  • 是的,我得到了通常的无法 POST /admin/uplaod 响应。我也看到这个cookie connect.sid s%3A3m42_Tc0F7vJI55nHd369BO489ULEXHq.cDM1emY64mlOMER6cnXUsw%2BMvFey2rmF%2OfWfmrAeY localhost / http:true Secure:false
  • 您是否正在导出admin.js 中设置的路由与module.exports = router;
  • @SureshPrajapati 邮递员帮我修好了,非常感谢
  • @heatoflisbon 到底缺少什么?

标签: javascript html node.js express router


【解决方案1】:

不确定您的服务器配置,但您可以在下面尝试

const port = 3000;

var express = require('express'),
    app = express();
var bodyParser = require('body-parser');

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

app.use(bodyParser.urlencoded({
   extended: false;
}));

app.use(bodyParser.json());

router.get('/', function (req, res) {
  console.log("Rendered Upload page")
  res.render('admin');
});

router.post('/upload', upload.single('file'), function (req, res) {
  console.log("Post made")
  res.response({file: req.file});
});

app.listen(port);

【讨论】:

  • 我在主 app.js 中有服务器配置很好。我已更新我的问题以包含此内容,感谢您提供任何帮助。
  • 你看到了吗?我已经编辑了我的问题以包含 app.js 文件
【解决方案2】:

下载、要求并将 multer 设置为目标。就在您的 //post 到 upoad 的路由之前,将文件上传到 db

const multer = require('multer')
const upload = multer({dest: 'images'})

【讨论】:

    【解决方案3】:

    请尝试

           <form action ="upload" method ="post" enctype="multipart/form-data">
    

    如果它按预期工作,还可以使用邮递员来测试你的 nodejs 处理程序 请查看此链接以使用邮递员进行文件上传postman file upload

    在测试帖子后,您可以确定哪个部分是错误的部分

    还请确保 multer 像

    一样初始化
    var multer  = require('multer')
    var upload = multer({ dest: 'uploads/' })
    

    在你的处理程序之前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2018-08-14
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多