首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在节点js中连接闪存不起作用

在节点js中连接闪存不起作用
EN

Stack Overflow用户
提问于 2018-04-17 21:49:03
回答 1查看 1.1K关注 0票数 0

我正在尝试使用app.js文件中的以下注册代码在我的数据库中注册一个用户。

请参考注册路由app.post。问题是,当我运行应用程序时,它抛出一个错误,即

未定义req,则在我创建flash消息的位置指示行:

Req.flash(‘错误消息’,‘用户名已注册’);

我尝试注释掉这一行,但只在它的res.redirect函数的下一行得到相同的错误。

似乎我请求和资源在我的注册函数中不可用。我对Node非常陌生,所以请耐心等待:-)

代码语言:javascript
复制
const express = require('express');
const path = require('path');
const exphbs = require('express-handlebars');
const methodOverride = require('method-override');
const flash = require('connect-flash');
const session =require('express-session');
const bodyParser = require('body-parser');
const errorHandler = require('errorhandler');
const routes = require('./routes');
const nconf = require('./config');
const setAuthUser = require('./middlewares/setAuthUser');
const neo4jSessionCleanup = require('./middlewares/neo4jSessionCleanup');
const writeError = require('./helpers/response').writeError;

const uuid = require('node-uuid');
const randomstring = require("randomstring");
const _ = require('lodash');


var Users = require('./models/users');
var loginRequired = require('./middlewares/loginRequired');
var dbUtils = require('./neo4j/dbUtils');


const app = express();


  // Body Parser middleware
  app.use(bodyParser.urlencoded({ extended: false}));
  app.use(bodyParser.json());

  var api = express.Router();

app.use(nconf.get('api_path'), api);

// Flash middleware
app.use(flash());


  //api custom middlewares:
api.use(setAuthUser);
api.use(neo4jSessionCleanup);

  // Handlebars middleware
app.engine('handlebars', exphbs({
    defaultLayout: 'main'
  }));
  app.set('view engine', 'handlebars');

  // static folder
app.use(express.static(path.join(__dirname, 'public')));

//method override middleware
api.use(methodOverride('_method'));

// Express Session middleware
app.use(session({
    secret: 'secret',
    resave: true,
    saveUninitialized: true,
}));

// global variables
app.use(function(req, res, next){
    res.locals.success_msg = req.flash('success_msg');
    res.locals.error_msg = req.flash('error_msg');
    res.locals.error = req.flash('error');
    res.locals.user = req.user || null;
    next();
});

// index route
app.get('/', (req, res)=>{
    const title = 'welcome1';
    res.render('index', {
        title: title
    });
});


// User Register Route
    app.get('/users/register', (req, res) => {
        res.render('users/register');
  });

  app.post('/users/register',(req, res,next) => {
        var username = req.body.username;
        var password = req.body.password;

    if (!username) {
      //throw {username: 'This field is required.', status: 400};
      req.flash('error_msg', 'username field is required');
      res.redirect('/users/register');
    }
    if (!password) {
      //throw {password: 'This field is required.', status: 400};
      req.flash('error_msg', 'password field is required');
      res.redirect('/users/register');
    }

    register(dbUtils.getSession(req), username, password)
      .then(response => {
        req.flash('success_msg', 'You are now registered');
        res.redirect('/users/login');
      })
      .catch(next);
  });

//api routes
//api.post('/register', routes.users.register);
api.post('/login', routes.users.login);
api.get('/users/me', routes.users.me);
api.get('/movies', routes.movies.list);
api.get('/movies/recommended', routes.movies.getRecommendedMovies);
api.get('/movies/rated', routes.movies.findMoviesRatedByMe);
api.get('/movies/:id',  routes.movies.findById);
api.get('/movies/genre/:id',  routes.movies.findByGenre);
api.get('/movies/daterange/:start/:end', routes.movies.findMoviesByDateRange);
api.get('/movies/directed_by/:id', routes.movies.findMoviesByDirector);
api.get('/movies/acted_in_by/:id', routes.movies.findMoviesByActor);
api.get('/movies/written_by/:id', routes.movies.findMoviesByWriter);
api.post('/movies/:id/rate', routes.movies.rateMovie);
api.delete('/movies/:id/rate', routes.movies.deleteMovieRating);
api.get('/people', routes.people.list);
api.get('/people/:id', routes.people.findById);
api.get('/people/bacon', routes.people.getBaconPeople);
api.get('/genres', routes.genres.list);

//api error handler
api.use(function(err, req, res, next) {
  if(err && err.status) {
    writeError(res, err);
  }
  else next(err);
});


var register = function (session, username, password) {
  return session.run('MATCH (user:User {username: {username}}) RETURN user', {username: username})
    .then(results => {
      if (!_.isEmpty(results.records)) {
        //throw {username: 'username already in use', status: 400}
        req.flash('error_msg', 'Username already registered');
        res.redirect('/users/register');
      }
      else {
        return session.run('CREATE (user:User {id: {id}, username: {username}, password: {password}, api_key: {api_key}}) RETURN user',
          {
            id: uuid.v4(),
            username: username,
            password: hashPassword(username, password),
            api_key: randomstring.generate({
              length: 20,
              charset: 'hex'
            })
          }
        ).then(results => {
            return new User(results.records[0].get('user'));
          }
        )
      }
    });
};


const port = 3000;

app.listen(port, () => {
    console.log(`Server started on port ${port}`);
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-17 22:14:43

由于reqresregister函数中不可访问,因此它们只能在中间件中访问,因此您必须将这些对象作为参数传递:

在函数定义中:

代码语言:javascript
复制
var register = function (session, username, password, req, res) { ... };

在函数调用中:

代码语言:javascript
复制
register(dbUtils.getSession(req), username, password, req, res)
  .then(response => {
    req.flash('success_msg', 'You are now registered');
    res.redirect('/users/login');
  })
  .catch(next);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49879917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档