Windows 8.1
具有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 errors数组中的值。
可能的语法错误,但我没有看到它。
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;
与Multer安装的npm不喜欢......
app.use(multer({dest: './uploads'}));
所以我把它改成了......
var upload = multer({ dest: './uploads' });
不确定会导致什么样的问题
答案 0 :(得分:1)
我之前面对的问题完全相同。作为解决问题的方法,我使用npm命令将 connect-multiparty 模块添加到我的项目中:
npm install connect-multiparty --save
然后我在快速变量定义之后的路由文件(user.js)之上添加代码。
var express = require('express');
..
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();
最后我在接受文件上传的路由器中使用 multipartMiddleware 。
...
router.post('/register', multipartMiddleware, function(req, res, next){
...
...
}
请注意,建议不要在所有路线中使用此模块,仅将其用于您要接受上传的路线。查看文档以获取更多详细信息https://www.npmjs.com/package/connect-multiparty
答案 1 :(得分:0)
使用multer你需要像中间件一样插入它:
var multer = require('multer');
var upload = multer({dest: 'uploads/'});
var fileLoad = upload.single('profileImage');
router.route('/register')
.post(fileLoad, function (req, res) {
.......
}