【问题标题】:NodeJS and Express JS: 404 while trying to get to the routerNodeJS 和 Express JS:尝试访问路由器时出现 404
【发布时间】:2021-08-24 19:26:46
【问题描述】:

我正在做一个需要上传文本的项目。但是由于某种原因,控制权并没有转移到路由器上。另外,只有这个特定的路由器功能不起作用,路由器中的其他路由功能起作用

这是我的相关代码

这是收集数据的表格

    <div class="content ui segment" id="two">
        <form  method="POST" action = "/documents/uploadDoc">
          <h2>Name</h2>
          <br>
          <input class='button' type="text" id="myName" name="name">
          <input type="submit" name = "Submit">
        </form>
    </div>

documents.js 中的路由代码:

router.post("/uploadDoc",function(req,res,next){
  console.log("Uploading");
  res.redirect("/documents");
});

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 dbSetup = require('./db_setup');
var firebase = require('firebase');
var bucket = require('./firebase_storage');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var courseRouter = require('./routes/course');
var documentsRouter = require('./routes/documents');
var classroomRouter = require('./routes/classroom');
var apiRouter = require('./routes/api');

const e = require('express');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

// set user
app.use(function(req, res, next) {
  var user = firebase.auth().currentUser;
  res.locals.user = null;
  if(user) {
    var users = firebase.database().ref('/users');
    users.on('value', (snapshot) => {
      var data = snapshot.val();
      for(var rno in data) {
        var em = data[rno].email;
        if(em.localeCompare(user.email) == 0) {
          res.locals.user = data[rno];
        }
      }
    });
    res.locals.userEmail = user;
  }
  res.locals.url = process.env.FIREBASE_STORAGE_URL;
    next();
});

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/course', courseRouter);
app.use('/documents', documentsRouter);
app.use('/classroom', classroomRouter);
app.use('/api', apiRouter);





// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error.jade');
});



module.exports = app;

单击提交按钮时,我收到 404 错误,控制台中也没有打印“上传”。请帮忙

【问题讨论】:

  • console.log 中有Uploading 吗?
  • 检查documentsRouter 是否被导出。
  • 请不要再使用var。使用letconst。您从require() 分配的几乎所有内容都应该是const

标签: node.js forms express http-status-code-404


【解决方案1】:

我重新启动了 VSCode,虽然它没有意义,但它以某种方式工作。如果您遇到同样的问题,我建议您重新启动软件。

【讨论】:

    【解决方案2】:

    您的 nodejs 需要接受 multipart/form-data 来处理您的发布请求,或者您需要将文件转换为 base64 以将其作为 json 参数发送

    这里是 multipart/form-data 的示例

    您可以使用multer 来完成此操作。

    var multer  = require('multer')
    var upload = multer({ dest: './public/data/uploads/' })
    app.post('/stats', upload.single('uploaded_file'), function (req, res) {
       // req.file is the name of your file in the form above, here 'uploaded_file'
       // req.body will hold the text fields, if there were any 
       console.log(req.file, req.body)
    });
    

    不要忘记更改文件名以供您使用 upload.single('yourFileName') ex:

    <form action="/stats" enctype="multipart/form-data" method="post">
      <div class="form-group">
        <input type="file" class="form-control-file" name="uploaded_file">
        <input type="text" class="form-control" placeholder="Number of speakers" name="nspeakers">
        <input type="submit" value="Get me the stats!" class="btn btn-default">            
      </div>
    </form>
    

    【讨论】:

    • 为什么 OP 需要multipart/form-data?他们显示的表单是一个简单的文本字段。不需要mutli-part。此外,这个问题无论如何不会导致 404,它会导致 req.body 未被解析,但所需的路由仍然命中。
    猜你喜欢
    • 2017-09-28
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    相关资源
    最近更新 更多