【发布时间】:2016-01-02 23:03:48
【问题描述】:
Windows 8.1
Nodejs 与 Express
控制台输出是...
$ npm start
> nodeauth@1.0.0 start e:\nodejs\_projects\nodeauth
> node ./bin/www
GET /users/register 200 525.115 ms - 2078
GET /stylesheets/style.css 304 7.118 ms - -
GET /stylesheets/bootstrap.css 304 7.198 ms - -
GET /javascripts/bootstrap.js 304 8.063 ms - -
Name is... undefined
reqName... undefined
PW is... undefined
PW2 is.. undefined
POST /users/register 200 79.328 ms - 2340
GET /stylesheets/bootstrap.css 304 7.847 ms - -
GET /stylesheets/style.css 304 7.378 ms - -
GET /javascripts/bootstrap.js 304 8.676 ms - -
register.jade 是...
表单加载正常并且看起来是正确的
extends layout
block content
h1 Register
p Complete form for site registration
ul.errors
if errors
each error, i in errors
li.alert.alert-danger #{error.msg}
form(method='post',action='/users/register',enctype='multipart/form-data')
.form-group
input.form-control(name='name', type='text', placeholder='Full Name')
.form-group
input.form-control(name='email', type='email', placeholder='Valid Email')
.form-group
input.form-control(name='username', type='text', placeholder='Username')
.form-group
input.form-control(name='password', type='password', placeholder='Password')
.form-group
input.form-control(name='password2', type='password', placeholder='Confirm Password')
.form-group
label Profile Image
input.form-control(name='profileimage', type='file')
input.btn.btn-default(name='submit', type='submit', value='Register')
user.js 是...
console.log 语句中的值在控制台输出中未定义。
post 方法不得从表单发送任何内容。
users.js 错误数组中的值在提交后显示。
可能的语法错误,但我没有看到。
var express = require('express');
var router = express.Router();
/* GET users listing. */
router.get('/', function(req, res, next) {
res.send('respond with a resource');
});
router.get('/register', function(req, res, next) {
res.render('register', {
'title': 'Register'
});
});
router.get('/login', function(req, res, next) {
res.render('login', {
'title': 'LogIn'
});
});
router.post('/register', function(req, res, next) {
// Get form values
var name = req.body.name;
var email = req.body.email;
var username = req.body.username;
var password = req.body.password;
var password2 = req.body.password2;
console.log('Name is... ', name);
console.log('reqName... ', req.body.name);
console.log('PW is... ', password);
console.log('PW2 is.. ', password2);
// Check for image field
if (req.body.profileimage) {
console.log('Uploading file...');
// File info
var profileImageOriginalName = req.files.profileimage.originalname;
var profileImageName = req.files.profileimage.name;
var profileImageMime = req.files.profileimage.mimetype;
var profileImagePath = req.files.profileimage.path;
var profileImageExt = req.files.profileimage.extension;
var profileImageSize = req.files.profileimage.size;
} else {
var profileImageName = 'noimage.png'; // default image
}
// Form validation using Express validator
req.checkBody('name', 'Name is required').notEmpty();
req.checkBody('email', 'Valid Email is required').notEmpty();
req.checkBody('email', 'Email is not valid').isEmail();
req.checkBody('username', 'Username is required').notEmpty();
req.checkBody('password', 'Password is required').notEmpty();
req.checkBody('password2', 'Passwords do not match').equals(req.body.password);
// Check for errors
var errors = req.validationErrors();
if (errors) {
res.render('register', { // Pass values back in so user does not have to retype
errors: errors,
name: name,
email: email,
username: username,
password: password,
password2: password2
});
} else {
// Create user object
var newUser = new User({
name: name,
email: email,
username: username,
password: password,
profileimage: profileImageName
});
// Create user
User.createUser(newUser, function(err, user){
if (err) throw err;
console.log(user);
});
// Success
req.flash('success', 'You are registered and may now login');
res.location('/');
res.redirect('/');
}
});
module.exports = router;
此外,文件在以下上下文中似乎无效...
if (req.files.profileimage) console.log('Uploading file...');
改为...
if (req.body.profileimage) console.log('Uploading file...');
但还不能测试。
至于中间件...
Package.json 是...
{
"name": "nodeauth",
"version": "1.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.13.2",
"connect-flash": "*",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"express": "~4.13.1",
"express-messages": "*",
"express-session": "*",
"express-validator": "*",
"jade": "~1.11.0",
"mongodb": "*",
"mongoose": "*",
"morgan": "~1.6.1",
"multer": "^1.0.3",
"passport": "*",
"passport-http": "*",
"passport-local": "*",
"serve-favicon": "~2.3.0"
}
}
而 app.js 文件是...
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var expressValidator = require('express-validator');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var bodyParser = require('body-parser');
var multer = require('multer');
var flash = require('connect-flash');
var mongo = require('mongodb');
var mongoose = require('mongoose');
var db = mongoose.connection;
var upload = multer({ dest: './uploads' });
var routes = require('./routes/index');
var users = require('./routes/users');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// Handle file uploads
var upload = multer({ dest: './uploads' });
// ??? app.use(multer({dest: './uploads'}));
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// Handle Express sessions
app.use(session({
secret: 'secret',
saveUninitialized: true,
resave: true
}));
// Passport ... Note: Passport middleware must be after Express session middleware above
app.use(passport.initialize());
app.use(passport.session());
// Validator
// In this example, the formParam value is going to get morphed into form body format useful for printing.
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
};
}
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// Flash and Express-Messages
app.use(flash());
app.use(function (req, res, next) {
res.locals.messages = require('express-messages')(req, res);
next();
});
app.use('/', routes);
app.use('/users', users);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
module.exports = app;
npm install with Multer 不喜欢...
app.use(multer({dest: './uploads'}));
所以我把它改成了...
var upload = multer({ dest: './uploads' });
还不确定会导致什么问题
【问题讨论】:
-
应用程序使用什么中间件来解析
multipart/form-data正文内容? ExpressJS 没有内置对此的支持。 -
将 package.json 和 app.js 添加到列出的文件中。我相信我现在已经具备了表单能够将数据发布到 users.js 所需的一切
-
改变
form(method='post',action='users/register',enctype='multipart/form-data')
-
将表单(method='post',action='users/register',enctype='multipart/form-data') 更改为表单(method='post',action='users/register ') 在 register.jade 中允许将表单数据发布到 users.js 但这些值不会传递回表单以从检查 users.js 中的错误代码中预填充字段 任何想法为什么 multipart/form-data 不工作?我想我以后需要它来处理图像。
标签: javascript node.js express pug