Node.js Express应用程序-用户登录和注册错误

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

我对node.js和Express一无所知。我想建立一个应用程序与用户管理。我已经查阅了stormpath网站 应用程序的构建和显示如下所示:

单击“立即注册”和“立即登录”时,会出现以下错误:

我完全遵循了教程,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.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。