我必须有两个控制器和两个单独的路由器。 bookController.js运行完美。现在,我创建了userControllers来处理注册和登录逻辑,但是req.body为空。我试图用console.log查看表单是否通过。但我变成空的或未定义的
我不知道自己在做什么或做错了什么
谢谢
这是app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
//const csurf = require('csurf');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var methodOverride = require('method-override')
//const multer = require('multer');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var bookRouter = require('./routes/book');
//Cross site request forgery
//const csrfMiddleware = csurf({cookie: true});
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(csrfMiddleware);
app.use(methodOverride('_method'))
//app.use(multerConfig );
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/', bookRouter);
// 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');
});
module.exports = app;
usersControllers.js
const knex = require('../model/connection');
exports.register = function(req, res)
{
//REGISTER USER FORM PAGE
res.render('user/register');
}
exports.registeruser = function(req, res, next)
{
//REGISTER USER HANDLE
console.log(req.body.username);
console.log(req.body.email);
console.log(req.body.password);
console.log(req.body.password1);
res.render('user/dashboard');
}
这是route / users.js
var express = require('express');
var router = express.Router();
var usersControllers = require('../controllers/usersControllers');
/* GET users listing. */
router.get('/dashboard', usersControllers.index);
router.get('/register', usersControllers.register);
router.get('/login', usersControllers.login);
router.post('/registeruser', usersControllers.registeruser);
module.exports = router;
这是表格
<%- include('../includes/layout'); %>
<div class="container">
<div class="row">
<div class="col-lg-3"></div>
<div class="col-lg-6">
<div class="card">
<div class="card-header bg-primary"> Create User </div>
<form id="c_form-h" class="" method="post" action="/users/registeruser" enctype="multipart/form-data" style="padding: 5px;">
<div class="form-group row">
<label for="username" class="col-6 col-form-label">Username</label>
<div class="col-12">
<input type="text" class="form-control" name="username" placeholder="Add UserName">
</div>
</div>
<div class="form-group row">
<label for="email" class="col-6 col-form-label">Email</label>
<div class="col-12">
<input type="email" class="form-control" name="email" placeholder="Add Email">
</div>
</div>
<div class="form-group row">
<label for="password" class="col-6 col-form-label">Password</label>
<div class="col-12">
<input type="password" class="form-control" name="password" placeholder="Enter Password">
</div>
</div>
<div class="form-group row">
<label for="password1" class="col-6 col-form-label">Password</label>
<div class="col-12">
<input type="password" class="form-control" name="password1" placeholder="Enter Password Again">
</div>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
<div class="col-lg-3"></div>
</div>
</div>
<%- include('../includes/footer'); %>
答案 0 :(得分:0)
让我们尽量保持最低的技术水平。
假设您正在将HTML表单数据发送到node-js服务器,即您向服务器发出了请求。服务器文件将在请求对象下接收您的请求。现在按逻辑,如果您在服务器文件中控制台记录此请求对象,则应该在其中的某些位置看到表单数据,然后可以将其提取出来,但是哇!你实际上不!
那么,我们的数据在哪里?如果它不仅出现在我的请求中,我们将如何提取它。
对此的简单解释是http以分段形式发送表单数据,目的是在到达目的地时进行组装。那么您将如何提取数据。 使用一种叫做“ body-parser”的东西可以为您做到这一点。
body-parser解析您的请求并将其转换为一种格式,您可以从中轻松提取您可能需要的相关信息。 首先,在您的app.js文件中需要以下内容。
var bodyParser = require('body-parser')
并添加以下行使其生效
app.use(bodyParser.urlencoded({extended: true}));
答案 1 :(得分:0)
简短的回答:尽管您有来自URL的数据,但您无法使用该数据。使用bocy-parser软件包可以解决此问题。
npm install body-parser --save
这将安装body-parser软件包。它的作用是将返回的响应数据绑定在一起,以便您可以实际使用它。没有它,您就只能将数据获取到端点,而无法使用它。
像这样使用正文解析器:
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({extended: true}));
然后在函数中尝试使用数据的内部做类似的事情
console.log(req.body.username);
console.log(req.body.email);
console.log(req.body.password);
console.log(req.body.password1);
我了解您已经按上述要求尝试执行主体解析器。尝试为此创建一个单独的端点。尝试在单独的/ registeruser端点中执行此操作,而不是/ users / registeruser,查看是否可行。如果有,请重试一下端点设置,否则请进一步评论。