Node.js Express应用程序-用户登录和注册错误
我对node.js和Express一无所知。我想建立一个应用程序与用户管理。我已经查阅了stormpath网站 应用程序的构建和显示如下所示: 单击“立即注册”和“立即登录”时,会出现以下错误: 我完全遵循了教程,server.js如下所示:Node.js Express应用程序-用户登录和注册错误,node.js,express,Node.js,Express,我对node.js和Express一无所知。我想建立一个应用程序与用户管理。我已经查阅了stormpath网站 应用程序的构建和显示如下所示: 单击“立即注册”和“立即登录”时,会出现以下错误: 我完全遵循了教程,server.js如下所示: var express = require('express'); var stormpath = require('express-stormpath'); var app = express(); app.set('views', './v
var express = require('express');
var stormpath = require('express-stormpath');
var app = express();
app.set('views', './views');
app.set('view engine', 'jade');
app.use(stormpath.init(app, {
expand: {
customData: true
}
}));
app.get('/', stormpath.getUser, function(req, res) {
res.render('home', {
title: 'Welcome'
});
});
app.use('/profile',stormpath.loginRequired,require('./profile')());
app.on('stormpath.ready',function(){
console.log('Stormpath Ready');
});
app.listen(3000);
html
head
title=title
link(href='//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css',
rel='stylesheet')
body
div.container
div.jumbotron
h1 Release Control System
if user
p Welcome, #{user.fullName}
p
a.small(href="profile") Edit my profile
form(action='/logout', method='POST')
button.btn.btn-default(type="submit") Logout
else
p Welcome to the release control system , please log in to get started.
p
a.btn.btn-primary(href="/login") Login now
p
span.small Don't have an account?
span
a.small(href="/register") Register now
该指数如下:
var express = require('express');
var stormpath = require('express-stormpath');
var app = express();
app.set('views', './views');
app.set('view engine', 'jade');
app.use(stormpath.init(app, {
expand: {
customData: true
}
}));
app.get('/', stormpath.getUser, function(req, res) {
res.render('home', {
title: 'Welcome'
});
});
app.use('/profile',stormpath.loginRequired,require('./profile')());
app.on('stormpath.ready',function(){
console.log('Stormpath Ready');
});
app.listen(3000);
html
head
title=title
link(href='//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css',
rel='stylesheet')
body
div.container
div.jumbotron
h1 Release Control System
if user
p Welcome, #{user.fullName}
p
a.small(href="profile") Edit my profile
form(action='/logout', method='POST')
button.btn.btn-default(type="submit") Logout
else
p Welcome to the release control system , please log in to get started.
p
a.btn.btn-primary(href="/login") Login now
p
span.small Don't have an account?
span
a.small(href="/register") Register now
以及paackage.json
请告知应修改的位置以修复错误,包括按“立即登录”按钮
由于我不熟悉node.js和Express框架,我希望实现用户管理,因此非常感谢您的建议 我在Stormpath工作。使express stormpath与您的应用程序配合使用所需的设置最少。npm安装express stormpath并添加var stormpath=require'express-stormpath';,您只需再做两件事:
// Tell your express app to use Stormpath
app.use(stormpath.init(app, {
// Add optional configuration settings here
expand: {
customData: true
}
}));
// Wait for Stormpath to tell you it's ready
app.on('stormpath.ready',function(){
console.log('Stormpath Ready');
});
完成这些步骤后,您将立即自动获得/register、/login、/me、/verify和/forget路由以及这些路由的默认视图。我们的快速入门中介绍了这一点,您可以按照以下步骤操作:
解释如何设置一个真正基本的express项目,该项目有一个额外的视图,一个供登录用户使用的配置文件页面。下面是直接从教程复制/粘贴的代码。让我知道这是否适合你
server.js:
var express = require('express'); var stormpath = require('express-stormpath');
var app = express();
app.set('views', './views'); app.set('view engine', 'jade');
app.use(stormpath.init(app, { expand: {
customData: true } }));
app.get('/', stormpath.getUser, function(req, res) { res.render('home', {
title: 'Welcome' }); });
app.on('stormpath.ready',function(){ console.log('Stormpath Ready'); });
app.listen(3000);
profile.js:
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var csurf = require('csurf');
var express = require('express');
var extend = require('xtend');
var forms = require('forms');
var collectFormErrors = require('express-stormpath/lib/helpers').collectFormErrors;
// Declare the schema of our form:
var profileForm = forms.create({
givenName: forms.fields.string({
required: true
}),
surname: forms.fields.string({ required: true }),
streetAddress: forms.fields.string(),
city: forms.fields.string(),
state: forms.fields.string(),
zip: forms.fields.string()
});
// A render function that will render our form and
// provide the values of the fields, as well
// as any situation-specific locals
function renderForm(req,res,locals){
res.render('profile', extend({
title: 'My Profile',
csrfToken: req.csrfToken(),
givenName: req.user.givenName,
surname: req.user.surname,
streetAddress: req.user.customData.streetAddress,
city: req.user.customData.city,
state: req.user.customData.state,
zip: req.user.customData.zip
},locals||{}));
}
// Export a function which will create the
// router and return it
module.exports = function profile(){
var router = express.Router();
router.use(cookieParser());
router.use(bodyParser.urlencoded({ extended: true }));
router.use(csurf({ cookie: true }));
// Capture all requests, the form library will negotiate
// between GET and POST requests
router.all('/', function(req, res) {
profileForm.handle(req,{
success: function(form){
// The form library calls this success method if the
// form is being POSTED and does not have errors
// The express-stormpath library will populate req.user,
// all we have to do is set the properties that we care
// about and then cal save() on the user object:
req.user.givenName = form.data.givenName;
req.user.surname = form.data.surname;
req.user.customData.streetAddress = form.data.streetAddress;
req.user.customData.city = form.data.city;
req.user.customData.state = form.data.state;
req.user.customData.zip = form.data.zip;
req.user.customData.save();
req.user.save(function(err){
if(err){
if(err.developerMessage){
console.error(err);
}
renderForm(req,res,{
errors: [{
error: err.userMessage ||
err.message || String(err)
}]
});
}else{
renderForm(req,res,{
saved:true
});
}
});
},
error: function(form){
// The form library calls this method if the form
// has validation errors. We will collect the errors
// and render the form again, showing the errors
// to the user
renderForm(req,res,{
errors: collectFormErrors(form)
});
},
empty: function(){
// The form library calls this method if the
// method is GET - thus we just need to render
// the form
renderForm(req,res);
}
});
});
// This is an error handler for this router
router.use(function (err, req, res, next) {
// This handler catches errors for this router
if (err.code === 'EBADCSRFTOKEN'){
// The csurf library is telling us that it can't
// find a valid token on the form
if(req.user){
// session token is invalid or expired.
// render the form anyways, but tell them what happened
renderForm(req,res,{
errors:[{error:'Your form has expired. Please try again.'}]
});
}else{
// the user's cookies have been deleted, we dont know
// their intention is - send them back to the home page
res.redirect('/');
}
}else{
// Let the parent app handle the error
return next(err);
}
});
return router;
};
views/home.jade:
html
head
title=title
link(href='//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css', rel='stylesheet')
body
div.container
div.jumbotron
h1 Hello!
if user
p Welcome, #{user.fullName}
p
a.small(href="profile") Edit my profile
form(action='/logout', method='POST')
button.btn.btn-default(type="submit") Logout
else
p Welcome to my app, ready to get started?
p
a.btn.btn-primary(href="/login") Login now
p
span.small Don't have an account?
span
a.small(href="/register") Register now
视图/profile.jade:
html
head
title=title
link(
href='//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css',
rel='stylesheet'
)
body
div.container
div.page-header
h1 My Profile
if errors
each error in errors
div.alert.alert-danger
span #{error.error}
if saved
div.alert.alert-success
span Your profile has been saved
form.login-form.form-horizontal(method='post', role='form')
input(name='_csrf', type='hidden', value=csrfToken)
div.form-group
label.col-sm-4 First Name
div.col-sm-8
input.form-control(
placeholder='Your first name',
required=true,
name='givenName',
type='text',
value=givenName)
div.form-group
label.col-sm-4 Last Name
div.col-sm-8
input.form-control(placeholder='Your last name',
required=true,
name='surname',
type='text',
value=surname)
div.form-group
label.col-sm-4 Street address
div.col-sm-8
input.form-control(placeholder='e.g. 123 Sunny Ave',
required=true,
name='streetAddress',
type='text',
value=streetAddress)
div.form-group
label.col-sm-4 City
div.col-sm-8
input.form-control(placeholder='e.g. City',
required=true,
name='city',
type='text',
value=city)
div.form-group
label.col-sm-4 State
div.col-sm-8
input.form-control(placeholder='e.g. CA',
required=true,
name='state',
type='text',
value=state)
div.form-group
label.col-sm-4 ZIP
div.col-sm-8
input.form-control(placeholder='e.g. 94116',
required=true,
name='zip',
type='text',
value=zip)
div.form-group
div.col-sm-offset-4.col-sm-8
button.login.btn.btn-primary(type='submit') Save
div.pull-right
a(href="/") Return to home page
您应该尝试添加这样的路由:app.get'/profile',req,res=>{res.render'profile';};您提供的stormpath链接使用路由器处理其路由,这就是他们可以调用应用程序的原因。使用“/profile”、,。。。。;但既然你不用这个路由器。。。没有什么可管理的。实际上,只需在express stormpath中要求并在“stormpath.ready…”上添加app.on,您就可以自动获得/register、/login、/me以及一系列其他路由和视图。@mdeges,express stormpath中要求什么?请你再解释一下好吗?谢谢。很抱歉我说的模棱两可。您需要1个npm安装express stormpath,2个添加var stormpath=require'express-stormpath';对于您的服务器文件,3可以选择使用app.usestormpath.initapp、{…}配置stormpath,4可以使用'stormpath.ready'上的do app。。。。这在快速stormpath快速入门中有介绍:谢谢,这与我遵循的教程完全相同;执行步骤后,仍然会发生相同的错误。我在我的文件夹中找不到/register、/login、/me、/verify。我下载了apiKey.properties文件,但不知道如何将其保存到主目录中的以下位置:~/.stormpath/apiKey。properties@Samoth如果没有正确设置环境变量,则在运行node server.js时会出现401错误。您可以在启动服务器之前直接在终端中设置它们,如下所示:导出STORMPATH\u CLIENT\u APIKEY\u ID=xxx导出STORMPATH\u CLIENT\u APIKEY\u SECRET=xxx导出STORMPATH\u APPLICATION\u HREF=xxx请确保用实际的API密钥ID、SECRET和应用程序HREF替换“xxx”。如果您在windows计算机上,请尝试“设置”而不是“导出”/register、/login、/me,其他提供的路由将不可见,因为它们包含在库中。如果按照上述步骤设置环境变量,您将能够导航到localhost:3000/register、/login等。谢谢。我设置了环境变量,但404错误仍然发生。我检查了/register、/login、/me和其他提供的路由是否正确安装:C:\Users\user\sampple2\node\u modules\express stormpath\lib。